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


    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准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 多平台发布

  • 相关阅读:
    基于SSM技术的医院在线预约诊疗系统设计与实现 毕业设计-附源码011130
    【原创】Ubuntu Pro RealTime linux(Ubuntu22.04 安装PREEMPT-RT实时内核/PREEMPT-RT/ubuntu官方PREEMPT-RT)
    阿里老大哥十年开发经验总结的“SpringBoot实战笔记”,一切从底层开讲
    主备延迟的问题
    kubernetes集群编排(8)
    LeetCode地平线专场——第308场周赛题解
    【Python百宝箱】视觉算法秀:Python图像处理舞台上的巅峰对决
    【网络安全技术】——期末复习(冲刺篇)
    获得列表中的空的段的起始位置(Python)
    Can Language Models Make Fun? A Case Study in Chinese Comical Crosstalk
  • 原文地址:https://blog.csdn.net/njpkhuan/article/details/133625948