IdentityHashMap类是错误的吗?

时间:2012-08-31 10:53:10

标签: java

我使用java.util.IdentityHashMap进行了测试,请参阅

public class IdentityHashMapTest{
    public static void main(String args[]) {
        Map<String, String> m = new IdentityHashMap<String, String>();
        m.put("John", "Doe");
        m.put("John", "Paul");
        System.out.println(m.size());
    }
}

根据Java API说,

  

此类使用哈希表实现Map接口,在比较键(和值)时使用引用相等性代替对象相等

结果可能是2。但实际是1。 IdentityHashMap类是错误的吗?

3 个答案:

答案 0 :(得分:5)

将其更改为

       m.put("John", "Doe");
       m.put(new String("John"), "Paul");

它将有两个条目。字符串文字是合并的,因此"John" == "John"

答案 1 :(得分:1)

IdentityHashMap违反Map合约并使用对象标识来检查密钥相等而不是equals方法,因为Strings汇集其实际上是一个对象,您应该使用new String("John")来获取新条目在地图中。

答案 2 :(得分:1)

这是因为字符串文字是合并的。

您可以测试"John" == "John"是否为真。

因此,您使用的两个键不仅相同,而且相同。

摘自JLS #3.10.5

  

此外,字符串文字始终引用类String的相同实例。这是因为字符串文字被“实习”以便共享唯一的实例。

相关问题