请看下面的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 (应该是这样)。

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

提前致谢!

最佳答案

这里的问题在于你对数组的 hashCode 方法和 equals 方法的理解。
hashCode 方法可以在 Object 中找到,它将根据对象引用创建一个散列。
String 类使用基于对 charString 进行计算的自己的逻辑覆盖此方法(更准确地说,它使用公式 s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1] 计算哈希,其中 s[i]i 的第 String 字符)。这意味着对于 Strings 彼此的 2 equal ,您将始终通过调用 hashCode 获得相同的结果。
int[] 改为使用 Object 中的实现,因此从对象引用创建哈希。
这意味着对于具有相等值的 2 个数组,您仍然会通过调用 hashCode 获得不同的结果。

同样要比较两个数组的值,请使用 Arrays.equals 作为调用 int[].equals 与使用 == 运算符相同,后者再次用于引用比较。 Arrays.equals 改为对数组中的每个元素调用 equals 方法,并根据它们的相等性返回结果。

关于java - Java 中的对象标识和平等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50949324/

10-12 22:27