3

请看下面的2个例子:

String a = new String("hello");
String b = new String("hello");
System.out.println("a.hashCode() - " + a.hashCode());
System.out.println("b.hashCode() - " + b.hashCode());
System.out.println("a == b - " + (a == b));
System.out.println("a.equals(b) - " + (a.equals(b)));

结果:

a.hashCode() - 99162322
b.hashCode() - 99162322
a == b - false
a.equals(b) - true

如果我理解正确,我有 2 个不同的对象,因为单词new创建对象。但是我们看到hashCode是一样的,这意味着我错了。如果 hashCode 相同,我明白为什么a.equals(b)True

但是此代码的输出:

int [] a = {1, 2, 3};
int [] b = {1, 2, 3};
System.out.println("a.hashCode() - " + a.hashCode());
System.out.println("b.hashCode() - " + b.hashCode());
System.out.println("a == b - " + (a == b));
System.out.println("a.equals(b) - " + (a.equals(b)));

是不同的:

a.hashCode() - 1627674070
b.hashCode() - 1360875712
a == b - false
a.equals(b) - false

现在我们有两个不同的对象,因为hashCode是不同的,这就是为什么两个条件都是False(应该是这样)。

感觉我需要填补知识空白,并会感谢任何指导。

提前致谢!

4

1 回答 1

3

这里感知到的问题在于您对hashCode- 方法和equals数组方法的理解。

hashCode方法可以在中找到,Object并将基于对象引用创建一个散列。

该类根据在sString上完成的计算,用自己的逻辑覆盖此方法(更准确地说,它使用公式计算哈希,其中的-th 字符)。这意味着对于 2彼此,您将始终通过调用 获得相同的结果。charStrings[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]s[i]iStringStringsequalhashCode

而是使用该int[]实现Object从对象引用创建散列。这意味着对于具有相等值的 2 个数组,您仍然会通过调用hashCode.

此外,比较两个数组的值,使用Arrays.equalsas 调用int[].equals与使用运算符相同==- 再次 - 用于参考比较。Arrays.equals而是对数组中的每个元素调用该equals方法,并根据它们的相等性返回结果。

于 2018-06-20T13:28:00.053 回答