Java 中的对象身份和平等
Object Identity and Equality in Java
请看下面的两个例子:
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
class 基于对 String
的 char
进行的计算,使用自己的逻辑覆盖此方法(更准确地说,它使用公式 s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]
其中 s[i]
是 String
的第 i
个字符)。这意味着对于 2 Strings
和 equal
彼此,您将始终通过调用 hashCode
.
获得相同的结果
int[]
改为使用 Object
中的实现,因此从对象引用创建散列。
这意味着对于 2 个具有相等值的数组,您仍然会通过调用 hashCode
.
得到不同的结果
还可以使用 Arrays.equals
比较两个数组的值,因为调用 int[].equals
与使用 ==
运算符相同,后者再次用于参考比较。 Arrays.equals
改为对数组中的每个元素调用 equals
方法,并将 return 基于它们相等的结果。
请看下面的两个例子:
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
class 基于对 String
的 char
进行的计算,使用自己的逻辑覆盖此方法(更准确地说,它使用公式 s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]
其中 s[i]
是 String
的第 i
个字符)。这意味着对于 2 Strings
和 equal
彼此,您将始终通过调用 hashCode
.
int[]
改为使用 Object
中的实现,因此从对象引用创建散列。
这意味着对于 2 个具有相等值的数组,您仍然会通过调用 hashCode
.
还可以使用 Arrays.equals
比较两个数组的值,因为调用 int[].equals
与使用 ==
运算符相同,后者再次用于参考比较。 Arrays.equals
改为对数组中的每个元素调用 equals
方法,并将 return 基于它们相等的结果。