equals() 和 == 的区别、与hashCode() 的关系

== 和 equals()

  • ==
    它的作用是判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象。基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址。

  • equals
    它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量。主要有以下两种用法:

    1. 类没有覆盖 equals() 方法。则通过equals()比较该类的两个对象时,等价于通过 == 比较这两个对象。使用的默认是 Object 类 equals() 方法。
    2. 类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true(即,认为这两个对象相等)。
       

举个例子

public class test1 {
    
    
    public static void main(String[] args) {
    
    
    	String a1 = "a1"; // 放在常量池中
        String b1 = "b1"; // 从常量池中查找
        String a2 = new String("a2"); // a 为一个引用
        String b2 = new String("b2"); // b为另一个引用,对象的内容一样
        
        if (a1 == b1) // true,同一对象
            System.out.println("a1==b1");
        if (a2 == b2) // false,非同一对象
            System.out.println("a2==b2");
        if (a2.equals(b2)) // true,比较内容是否相等
            System.out.println("a is equals to b");
        }
    }
}

说明: String 中的 equals() 方法是被重写过的,因为 Object 中的 equals() 方法是比较对象的内存地址,而 String 中的 equals() 方法比较的是对象的值。

hashCode()

hashCode()的作用是获取哈希码,也称为散列码,返回一个int整数。哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在Object.java 中,因此Java中的任何类都包含有 hashCode() 函数。

哈希表(散列表)是指根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

为什么要有 hashCode()
以HashSet如何检查重复为例子来说明为什么要有hashCode:当你把对象加入 HashSet时,HashSet会先计算对象的hashcode 值来判断对象加入的位置,同时也会与该位置其他已经加入的对象的hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了使用equals()的次数,提高了执行速度。
 
hashCode()与 equals()的相关规定

  1. 如果两个对象相等,则 hashcode一定也是相同的

  2. 两个对象相等,对两个对象分别调用equals()方法都返回true

  3. 两个对象有相同的hashcode值,它们也不一定是相等的

  4. 因此,equals()方法被覆盖过,则 hashCode()方法也必须被覆盖。否则,虽然重写equals()比较两个对象得到两个对象的内容相等,但是它们的hashCode仍然不相等;

  5. hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),即使两个对象指向相同的数据,他们也不会相等

猜你喜欢

转载自blog.csdn.net/weixin_43901865/article/details/112565799