• Java 学习和实践笔记(28):equals方法的使用


    equals() 是Object类里的一个方法。而Object类是所有类的父类,所有的Java对象都拥有Object类的属性和方法。一切类,如果在类的声明中未使用extends,则默认继承Object类。如果声明了,那么Object类就变成该类的父类的父类的...类,该类也一样可以使用equals()方法。

    equals用来比较两个对象是否相同。默认情况下(也就是在Object类里的原始定义的方法),如果对象是基本类型,那么比较的是两个对象的值是否相等。如果对象是引用类型(所谓引用类型,就是自己定义的那些类),那么就是比较两个对象的地址是否相同。

    如果在实践中,我们比较两个对象时,认为某一个属性相同时,就认为这两个对象相同,那么这个时候就不能直接使用默认情况下,需要重写equals()这个方法。否则没法实现这个属性相同,就认为两个对象相同的功能!因为不同的对象,总是有不同的地址,按原来的比较方法,是不可能认为两个对象相同的。

    示例如下:

    1. public class TestObject {
    2. int id;
    3. String name;
    4. String pwd;
    5. public TestObject(int id, String name, String pwd) {//自定义的构造器
    6. this.id = id;
    7. this.name = name;
    8. this.pwd = pwd;
    9. }
    10. TestObject(){};//写了自定义构造器如仍要默认的构造器,就需要写出来。
    11. public static void main(String[] args) {
    12. /* TestObject t1 = new TestObject();
    13. System.out.println(t1.toString());//使用toString()方法得到t1的地址
    14. TestObject t2 = new TestObject();
    15. System.out.println(t2.toString());
    16. System.out.println(t2);//如果不写toString,默认也是调用toString()*/
    17. TestObject t3 = new TestObject(1001,"张三","123456");
    18. TestObject t4 = new TestObject(1001,"李四","654321");
    19. System.out.println(t3.toString());
    20. System.out.println(t4.toString());
    21. System.out.println(t3.equals(t4));//判断t3是否与t4相同
    22. }
    23. }

    可以看到,上面是比较了两个对象的地址,所以肯定是不同,返回false.

    如果想只比较id,则需要重写equals方法,用下面的方法自动生成:

    示例:

    1. import java.util.Objects;
    2. public class TestObject {
    3. int id;
    4. String name;
    5. String pwd;
    6. public TestObject(int id, String name, String pwd) {//自定义的构造器
    7. this.id = id;
    8. this.name = name;
    9. this.pwd = pwd;
    10. }
    11. TestObject(){};//写了自定义构造器如仍要默认的构造器,就需要写出来。
    12. @Override
    13. public boolean equals(Object o) { //重写equals方法,仅比较id
    14. if (this == o) return true;
    15. if (o == null || getClass() != o.getClass()) return false;
    16. TestObject that = (TestObject) o;
    17. return id == that.id;
    18. }
    19. @Override
    20. public int hashCode() {
    21. return Objects.hash(id);
    22. }
    23. public static void main(String[] args) {
    24. /* TestObject t1 = new TestObject();
    25. System.out.println(t1.toString());//使用toString()方法得到t1的地址
    26. TestObject t2 = new TestObject();
    27. System.out.println(t2.toString());
    28. System.out.println(t2);//如果不写toString,默认也是调用toString()*/
    29. TestObject t3 = new TestObject(1001,"张三","123456");
    30. TestObject t4 = new TestObject(1001,"李四","654321");
    31. System.out.println(t3.toString());
    32. System.out.println(t4.toString());
    33. System.out.println(t3.equals(t4));//判断t3是否与t4相同
    34. }
    35. }

  • 相关阅读:
    数环通入选中国信通院《高质量数字化转型技术方案集(2023)》,积极推动企业数字化转型
    本地虚拟机centos7通过docker安装主从mysql5.7.21
    docker打包并且推送到远端服务器
    vue-project-01
    LeetCode 0149. 直线上最多的点数
    索引优化分析_预热_JOIN
    探索Facebook的未来:新功能和趋势预测
    【C基础篇】算法、数据类型、运算符与表达式、常见输入出函数
    ILM ADO storage tiering policy on table partition
    生产环境上线更新要求
  • 原文地址:https://blog.csdn.net/qq_37191547/article/details/136473364