Java中的对象身份和平等

时间:2018-06-20 13:23:33

标签: java compare equals hashcode hash-code-uniqueness

请查看以下两个示例:

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 (应该是这样)的原因。

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

谢谢!

1 个答案:

答案 0 :(得分:3)

这里存在的问题在于您对数组的hashCode方法和equals方法的理解。

hashCode方法可在Object中找到,并将基于对象引用创建哈希。

String类基于对char的{​​{1}}进行的计算,使用其自己的逻辑覆盖了此方法(更确切地说,它使用公式{{1}计算哈希值},其中Strings[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]的第s[i]个字符。这意味着,对于2个i彼此String,您将始终通过调用Strings获得相同的结果。

equal使用hashCode中的实现,因此从对象引用创建哈希。 这意味着对于2个具有相等值的数组,您仍然可以通过调用int[]获得不同的结果。

另外,要比较两个数组的值,请使用Object,因为调用hashCode与使用Arrays.equals运算符相同,后者再次用于参考比较。 int[].equals而是对数组中的每个元素调用==方法,并将根据它们的相等性返回结果。