Java IdentityHashMap类错误吗?

Java IdentityHashMap类错误吗?,java,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"

我使用
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());
    }
}
public class IdentityHashMapTest{
公共静态void main(字符串参数[]){
Map m=新标识hashmap();
m、 put(“约翰”、“多伊”);
m、 放置(“约翰”、“保罗”);
System.out.println(m.size());
}
}
据JavaAPI称

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

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

将其更改为

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

它将有两个条目。字符串文本是池化的,因此
“John”==“John”

标识hashmap
违反映射契约,并使用对象标识来检查键的相等性,而不是
equals
方法,因为字符串实际上是池化为一个对象,所以应该使用
新字符串(“John”)
在映射中有新的条目。

这是由于字符串文字是池化的

您可以测试
“John”==“John”
是否正确

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

摘自:

此外,字符串文字总是引用类字符串的同一实例。这是因为字符串文本被“插入”以便共享唯一的实例


正如
“John”==“John”
一样,它们是同一个对象,因此您只有一个键。TreeMap和ConcurrentSkipListMap也不使用equals()。它们以其他方式冲突;-)。。通常在javadocs
中清除,各种集合框架接口的实现可以在实现者认为合适的情况下自由地利用底层对象方法的指定行为。
似乎获得了一个转义子句以避免冲突。true但IdentityHashMap javadocs在这个类实现Map接口时,它故意违反Map的一般约定,该约定要求在比较对象时使用equals方法。我注意到TreeMap说
已排序映射的行为定义良好,即使其顺序与equals不一致;它只是没有遵守Map接口的一般约定。
我不明白为什么Map要求在一半实现没有的情况下使用equals。