java中==,equals和hashcode的示例

时间:2010-04-28 17:47:21

标签: 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());

输出是:

false
false
true
true
96354
96354
96354

此处==为每个对象赋予false,但每个String对象的哈希码相同。为什么会这样?

4 个答案:

答案 0 :(得分:9)

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

String a = new String("aa");
String b = new String("aa"); 

ab指向不同的对象。

另请注意,如果对象相等,则它们的hashchodes必须相同,但如果hashcode相同,则并不意味着对象相等。

答案 1 :(得分:8)

等于合同表示如果o1.equals(o2),则为o1.hashCode() == o2.hashCode()。它没有指定任何关于不等对象的哈希码的内容。你可以有像

这样的方法
public int hashCode()
{
    return 42;
}

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

现在,至于为什么==不起作用,将始终通过引用比较两个对象。也就是说,如果o1 == o2,那么o1o2就是完全相同的对象。这很少是你想要的;您通常希望看看是否o1.equals(o2)

答案 2 :(得分:3)

当您使用==时,您正在比较两个变量是否保持对同一个Object的引用。换句话说,s1 == s2就像问:s1s2变量是否引用相同的String对象?即使两个String对象具有相同的“abc”值,也不是这样。

使用equals()时,您正在比较两个对象的值。两个对象可能不一样,但它们的值(在本例中为“abc”)是相同的,因此它返回true

如何定义一个对象是否等于另一个?随你(由你决定。在这种情况下,String对象已经为您定义了这个,但是例如,如果您定义了一个Person对象,您如何知道一个人P1是否等于P2?您可以通过覆盖equals()hashCode()来完成此操作。

答案 3 :(得分:0)

==告诉您两个变量引用是否指向内存中的同一个对象,仅此而已。 equals()hashCode()都会查看对象的内容,每个都使用自己的算法进行计算。