(== ) 在 hashCode 方面的功能

functioning of (== ) in terms of hashCode

字符串 s1="abc";

字符串 s2=新字符串("abc");

当我们比较两者时

s1==s2;它 return 错误

当我们比较它时 用 s1.hashCode()==s2.hashCode 它 return 真

我知道 (==) 检查引用 ID。在上面的比较中它 return 是真的吗因为上面的 hashCode 被保存到同一个桶?请给我解释

不要忘记您的哈希码是 原始 整数,使用 == 比较原始将比较它们的 ,而不是它们的引用(因为基元没有引用)

因此,具有相同内容的两个字符串将产生相同的散列码,并且通过 == 进行比较是完全有效的。

桶的概念仅在将对象放入散列集合(例如 HashSet)时才有效。哈希码的值决定了对象进入哪个桶。哈希码本身不会被存储。

第一次比较失败,因为它们是两个不同的对象。第二次比较之所以有效,是因为他们正在比较 hashCode() 函数的输出,该函数为两者生成相同的值。

使用相等运算符 (==) 比较对象时,您正在测试对象引用的相等性。对象引用只有在它们是同一对象时才相等。

通常指的是对象封装的concept/information相等。而这个最好用equal(Object obj)方法来确定。

对于字符串,这将是:

s1.equals(s2);

当您使用 s1==s2 比较两个字符串时,您是在比较 引用 。因为就在该行之前,您通过复制旧对象创建了一个新的 String 对象,所以两个引用都引用不同的对象,即使它们包含相同的值。

另一方面,hashCode 方法的作用取决于它的实现方式。规范说它必须符合 equals 函数(其行为还取决于它在具体类型中的实现方式):如果根据 equals 方法两个对象相等,则它们必须 return 相同的哈希码。由于 equals for String 比较值(而不是引用),因此两个 hashCode 调用必须 return 相同的值。由于 hashCode return 是一个 int,这是一种原始数据类型,因此您的 == 比较实际上比较 values,因此有效不出所料。

注意:如果您对不同于 String 的 class 进行了相同的实验,则不会覆盖 equalshashCode 方法(这是完美的有效;这只是在对象类型上定义相等性的另一种方式),它也将 returned false 用于 hashCode 比较:

public class MyObject {

    private int value;

    public MyObject(MyObject toCopy) {
        this.value = toCopy.value;
    }   

    public MyObject(int value) {
        this.value = value;
    }

    public static void main(String[] args) {
        MyObject s1 = new MyObject(0);
        MyObject s2 = new MyObject(s1);
        System.out.println(s1 == s2);                       // false
        System.out.println(s1.hashCode() == s2.hashCode()); // false
    }
}

这完全取决于 class 的程序员如何定义认为哪些对象相等。