java中==,equals和hashcode的示例

Abh*_*ain 5 java equals hashcode

鉴于这种:

String s1= new String("abc");
String s2= new String("abc");
String s3 ="abc";
System.out.println(s1==s3);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
Run Code Online (Sandbox Code Playgroud)

输出是:

false
false
true
true
96354
96354
96354
Run Code Online (Sandbox Code Playgroud)

这里==给每个对象赋予false,但每个String对象的哈希码是相同的.为什么会这样?

Mir*_*uta 9

==确实比较对象的真实相等(我的意思是 - 两个引用指向同一个对象),而不是它们的内容,而.equal比较内容(至少对于String).

String a = new String("aa");
String b = new String("aa"); 
Run Code Online (Sandbox Code Playgroud)

ab指向不同的对象.

另请注意,如果对象相等,则它们的哈希序列必须相同,但如果哈希码相同,则并不意味着对象相等.


cHa*_*Hao 8

等于合同说,如果o1.equals(o2),那么o1.hashCode() == o2.hashCode().它没有指定任何关于不等对象的哈希码的内容.你可以有一个类似的方法

public int hashCode()
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

它履行了合同.只是期望哈希码与对象的值相关,以使哈希表更有效地工作.

现在,至于为什么你的==工作不起作用,总会通过引用比较两个对象.也就是说,if o1 == o2,then o1o2是完全相同的对象.这很少是你想要的; 你通常想看看是否o1.equals(o2)相反.