• 通俗易懂的==和equals()的使用


    一、==

    “==”是运算符
    ①如果比较的对象是基本数据类型,则比较的是其存储的值是否相等
    ②如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)

    测试:
            int a = 1;
            int b = 2;
    
            int i = 10;
            int j = 10;
            double k = 10.0;
            char l = 10;
    
            System.out.println(a == b); //false
            System.out.println(i == j); //true
            System.out.println(i == k); //true
            System.out.println(i == l); //true
    
            Customer customer1 = new Customer("Tom",21);
            Customer customer2 = new Customer("Tom",21);
    
            System.out.println(customer1 == customer2); //false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    可以发现基本数据类型的变量之间进行比较值,除了布尔值不参与其中,剩下的只要值相等,就为TRUE!使用==比较对象比较的就是两个对象在堆内存中的地址值。

    二、equals()

    ①equals()是Object类中的一个方法,而非运算符

    ②只能适用于引用数据类型之间的比较

    我们看一看Object类中equals()方法的源码:

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

    发现Object类中定义的equals()和==的作用相同

    测试:
            Customer customer1 = new Customer("Tom",21);
            Customer customer2 = new Customer("Tom",21);
    
            System.out.println(customer1.equals(customer2));//false
    
            String s1 = new String("123");
            String s2 = new String("123");
            System.out.println(s1.equals(s2));//true
    
            Date date1 = new Date(32532352345L);
            Date date2 = new Date(32532352345L);
            System.out.println(date1.equals(date2));//true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    我们发现customer1和customer2使用equals进行比较,返回的是FALSE,是因为他们是两个对象,在堆内存中的地址当然不一样,但是像String、Date、File、包装类等等 他们都重写了Object类中的equals()方法,重写以后,比较的不是两个引用地址,而是比较的值,所以后面两个测试的结果都为FALSE。

    那出于好奇,来看一下String类中的equals是怎么写的:
    在这里插入图片描述
    其实就是分为三部分:
    ①首先比较了两个对象的地址,如果地址一样,那就直接返回TRUE了
    ②然后比较两个对象的类型,如果类型不一样,就直接返回FALSE,如果一样就强转类型
    ③最后就行进行字符串比较

    我们自己也将Customer类中原有的默认equals()方法重写

        //重写的原则:比较两个对象的实体内容是否相同
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj instanceof Customer) {
                Customer cust = (Customer) obj;
                if (this.age == cust.age && this.name.equals(cust.name)) {
                    return true;
                }
                return false;
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    重新测试之前的,发现结果为TRUE

       System.out.println(customer1.equals(customer2));//false==>true
    
    • 1

    那在我们实际开发当中,会有很多的实体类,如果说每一个都要重写equals()
    方法,那就比较麻烦了,所以我们可以自动生成。
    Alt+Insert之后选择**Generate hashCode() and equals()**就可以了。
    在这里插入图片描述

  • 相关阅读:
    并发-Java中的线程池
    热门开源项目
    SpringBoot项目整合RabbitMQ
    基于 ActionFilters 的限流库DotNetRateLimiter使用
    ik分词器
    大白话带你认识 Kafka,背后原理如此简单
    除gRPC之外的另一个选择,IceRPC-支持QUIC
    Flink 状态编程
    MIT 6.S081学习笔记(第二章)
    后端每日一题 1:说一下三次握手
  • 原文地址:https://blog.csdn.net/G823909/article/details/127726703