• 对象的相等和引用相等的区别


    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

    首发博客地址[1]

    面试题手册[2]

    系列文章地址[3]


    1. 什么是对象的相等和引用相等?

    • 对象的相等:当两个对象的内容相同或满足某种特定条件时,我们称这两个对象是相等的。在 Java 中,可以通过重写 equals()方法来判断对象的相等性。
    • 引用的相等:当两个对象引用指向内存中的同一个对象时,我们称这两个对象是引用相等的。在 Java 中,使用 ==运算符来比较两个对象的引用是否相等。

    2. 为什么需要区分对象的相等和引用相等?

    在编程过程中,我们经常需要比较对象的相等性。有时候我们只关心对象的内容是否相等,而不关心它们是否引用同一个对象。例如,在集合类中,我们需要根据对象的内容进行查找、删除等操作,此时就需要判断对象的相等性。另外,对于基本数据类型(如 int、char 等),直接使用==运算符即可判断相等性,但对于对象则需要使用equals()方法来判断相等性。

    3. 对象的相等和引用相等的实现原理?

    • 对象的相等:默认情况下,Java 中的对象比较是基于引用相等的,即使用==运算符比较两个对象的引用是否相等。如果要比较对象的内容是否相等,需要重写equals()方法。在重写equals()方法时,通常需要满足以下几个条件:

      • 自反性:对于任何非空引用 x, x.equals(x)应该返回 true。
      • 对称性:对于任何非空引用 x 和 y,如果 x.equals(y)返回 true,则 y.equals(x)也应该返回 true。
      • 传递性:对于任何非空引用 x、y 和 z,如果 x.equals(y)返回 true,并且 y.equals(z)返回 true,则 x.equals(z)也应该返回 true。
      • 一致性:对于任何非空引用 x 和 y,多次调用 x.equals(y)的结果应该保持一致。
      • 非空性:对于任何非空引用 x, x.equals(null)应该返回 false。
    • 引用的相等:使用==运算符比较两个对象的引用是否相等。当两个对象引用指向内存中的同一个对象时,它们是引用相等的。

    4. 对象的相等和引用相等的使用示例

    public class Person {
        private String name;
        private int age;

        // 构造方法、getter和setter省略

        @Override
        public boolean equals(Object obj) {
            if (this == obj) { // 引用相等
                return true;
            }
            if (obj == null || getClass() != obj.getClass()) { // 类型不同或为null
                return false;
            }
            Person person = (Person) obj;
            return age == person.age && Objects.equals(name, person.name); // 内容相等
        }
    }

    public class Main {
        public static void main(String[] args) {
            Person p1 = new Person("Alice"20);
            Person p2 = new Person("Bob"30);
            Person p3 = new Person("Alice"20);

            System.out.println(p1.equals(p2)); // false,内容不相等
            System.out.println(p1.equals(p3)); // true,内容相等
            System.out.println(p1 == p3); // false,引用不相等
        }
    }
    • 1

    5. 对象的相等和引用相等的优点

    • 对象的相等:通过重写 equals()方法,可以根据对象的内容来判断相等性,而不仅仅是引用是否相等。这样可以更灵活地比较对象的相等性。
    • 引用的相等:使用 ==运算符比较两个对象的引用是否相等,效率高。

    6. 对象的相等和引用相等的缺点

    • 对象的相等:需要重写 equals()方法,并满足一定的条件,才能正确判断对象的相等性。如果没有正确实现 equals()方法,可能会导致错误的结果。
    • 引用的相等:只能判断两个对象的引用是否相等,无法判断对象的内容是否相等。

    7. 对象的相等和引用相等的使用注意事项

    • 在重写 equals()方法时,需要满足自反性、对称性、传递性、一致性和非空性等条件,以确保正确判断对象的相等性。
    • 在使用 ==运算符比较两个对象的引用时,需要注意是否真正需要比较对象的引用相等,而不是内容相等。

    8. 总结

    对象的相等和引用相等是编程中常用的概念。对象的相等通过重写equals()方法来实现,可以根据对象的内容来判断相等性;引用的相等通过==运算符来比较两个对象的引用是否相等。在使用时需要注意区分二者,并根据具体需求选择合适的方式进行比较。

    参考资料

    [1]

    首发博客地址: https://blog.zysicyj.top/

    [2]

    面试题手册: https://store.amazingmemo.com/chapterDetail/1685324709017001

    [3]

    系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/

    本文由 mdnice 多平台发布

  • 相关阅读:
    计算机毕设之基于数据可视化的智慧社区内网平台python+django+mysql(含开题+源码+部署教程)
    Spring webflux 构建响应式 RESTful Web 服务
    金仓数据库KingbaseES整型与浮点类型数据比较隐式转换规则
    Go语言入门心法(十五):Go微服务实战
    动态链接库--导出类(二)
    UE蓝图学习(从Unity3D而来)
    景联文科技:专业提供高质量大语言模型训练数据
    【开源】JAVA+Vue.js实现医院门诊预约挂号系统
    【博学谷学习记录】超强总结,用心分享丨大数据从0到1落地(一):Scala基础语法
    从零学习python:数据分析与Excel
  • 原文地址:https://blog.csdn.net/njpkhuan/article/details/133625948