Java中的对象标识和相等

Java中的对象标识和相等,java,compare,equals,hashcode,hash-code-uniqueness,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.e

请看下面的两个例子:

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
如果我理解正确,我有两个不同的对象,因为wordnew创建了对象。但是我们看到,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
中找到,它将基于objects引用创建一个hash

String
类基于对
String
char
s进行的计算,使用自己的逻辑覆盖此方法(更精确地说,它使用公式
s[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]
其中
s[i]
字符串
的第i个字符。这意味着,对于彼此相等的两个
字符串
,通过调用
hashCode
始终可以得到相同的结果

int[]
使用
Object
中的实现,因此从Object引用创建哈希。 这意味着对于具有相等值的两个数组,通过调用
hashCode
仍将得到不同的结果


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

要比较数组,你应该使用
Arrays.equals()
有很多网站解释哈希代码是如何工作的,比如你能解释为什么
a.equals(b)-阵列是否为false
?我认为这也是一个重要的问题part@Ben谢谢你的详细回答!是的,这是真的,我一分钟前也读过同样的内容,在把这个问题发布到网上之前,我可能应该更耐心一些。谢谢大家!@我刚刚看过Java标准库。当谈到字符串时,
equals()
方法已经被重写,所以它可以像您所期望的那样工作。另一方面,默认情况下使用数组编写。