• 重写 equals 方法,实现比较两个对象值是否相等


    equals

    == 用于比较值的引用地址是否一致,而 equals 用于比较值的内容是否一致,下面我们来比较一下这两个值是否相同

    String x = "Hello";
    String y = "Hello";
    System.out.println(x.equals(y)); // true
    
    • 1
    • 2
    • 3

    可以发现它的值是相同的

    下面我们来对两个对象的值进行比较

    public class Main {
        public static void main(String[] args) {
            A x = new A("John", 20);
            A y = new A("John", 20);
    
            System.out.println(x == y); // false
            System.out.println(x.equals(y)); // false
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以发现值的内容确实相同,但比较的结果是 false

    其实在 object 中的 equals 底层使用的还是 == 进行比较的,所以他比较的还是值的引用地址并非值本身

    下面是它的底层源码

    public boolean equals(Object obj) {
    	return (this == obj);
    }
    
    • 1
    • 2
    • 3

    为什么 Stringequals 就可以比较值呢?大家可以看看它的底层

        public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            return (anObject instanceof String aString)
                    && (!COMPACT_STRINGS || this.coder == aString.coder)
                    && StringLatin1.equals(value, aString.value);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以发现它的底层并非使用 == 进行比较,而是比较值是否相等。

    这也就是为什么 Object 中的 equals 无法比较值的内容是否相等而 String 却可以的原因

    那如果非要实现对象的 equals 方法支持比较值的内容是否一致,那么可以在对应的类(A类)中重写这个方法

    	@Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            A a = (A) o;
            return age == a.age && Objects.equals(name, a.name);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    public class Main {
        public static void main(String[] args) {
            A x = new A("John", 20);
            A y = new A("John", 20);
    
            System.out.println(x == y); // false
            System.out.println(x.equals(y)); // true
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这样就完美实现了比较两个对象内容是否一致的功能

  • 相关阅读:
    血清与血浆
    Mybatis入门,day2,动态SQL
    RequestMappingHandlerMapping类的简介说明
    【软考 系统架构设计师】嵌入式系统⑤ 嵌入式系统开发与设计
    尚医通gateway配置bug
    【解决】VSCode编写C++自定义头文件undefined reference异常问题
    从零开始编写一个 Python 异步 ASGI WEB 框架
    基于SpringBoot+MyBatis-Plus的图书管理系统
    Centos7 安装 RabbitMQ
    vue之若依分页组件的导入使用(不直接使用若依框架,只使用若依分页组件)
  • 原文地址:https://blog.csdn.net/haodian666/article/details/132970599