== vs。hashcode中java的字符串比较

时间:2017-03-02 14:08:46

标签: java string

    String obj1 = new String("abc");
    String obj2 = new String("abc");

    if(obj1.hashCode() == obj2.hashCode())
        System.out.println("hashcode()");


    if(obj1==obj2))
        System.out.println("==");

它打印hashcode(),但为什么它不打印==作为两个对象的哈希码是相同的?

具有相同的哈希码并不意味着引用指向同一个对象?

2 个答案:

答案 0 :(得分:0)

相同的hashCode并不代表同一个对象,请查看the general contract of hashcode

hashCode的一般合约是:

  • 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。
  • 如果两个对象根据equals(Object)方法相等,则对两个对象中的每个对象调用hashCode方法必须生成相同的整数结果。
  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。

答案 1 :(得分:0)

obj1 == obj2将返回false,因为“==”会比较引用而不是值,您的对象都具有相同的值但存储在不同的内存部分中。

.equals()会比较对象的值。

所以:
obj1 == obj2(假)
obj1 == obj1(真)