两个String对象的Equals()为true,但它们的hashCode()返回false

时间:2015-03-30 18:40:22

标签: string equals hashcode

String

上的小程序
    String str1 = new String("Hello");
    String str2 = "Hello";
    System.out.println("=======================");
    System.out.println("Srtr1 == Str2 :: "  + (str1 == str2));
    System.out.println("Srtr1.equals(Str2) :: " + str1.equals(str2));

输出:        Srtr1 == Str2 :: false        Srtr1.equals(Str2):: true

现在怎么可能?我们知道如果两个对象的equals()为真,那么两个对象的HashCode()必须为true。但是如果HashCode()为true,则Equals()可能为true或者可能不为true。

但是在上面的程序中,我们看到,两个String对象的equals()为true,但是它们的hashCode()返回false。

为什么会如此?

2 个答案:

答案 0 :(得分:1)

你根本没有比较hashCode()。你在比较平等和身份。

两个字符串的标识是不同的,因为您已经看到为每个字符串分配了新对象。身份比较'=='返回false。

两个字符串的值是相同的,因此equals()方法返回true。

答案 1 :(得分:0)

==运算符将验证指向每个String的指针是否指向同一个对象,在这种情况下它们不是。这与对象的hashCode()非常不同,后者返回该对象内数据的整数哈希值。要验证这一点,您应该替换

System.out.println("Srtr1 == Str2 :: "  + (str1 == str2));

通过

System.out.println("Srtr1.hashCode() == Str2.hashCode() :: "
+ (str1.hashCode() == str2.hashCode()));

这将证明你的两个字符串的hashCode确实相等:)