0

我测试过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 类错了吗?

4

3 回答 3

5

将其更改为

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

它将有两个条目。字符串文字是池化的,所以"John" == "John".

于 2012-08-31T10:54:35.127 回答
1

IdentityHashMap违反 Map 合同并使用对象标识而不是equals方法来检查密钥相等性,因为字符串实际上是一个对象池化,因此您应该使用new String("John")在 Map 中拥有新条目。

于 2012-08-31T10:54:48.800 回答
1

这是因为字符串文字是池化的。

你可以测试这"John" == "John"是真的。

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

从JLS #3.10.5中提取:

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串文字是“内部的”以便共享唯一的实例。

于 2012-08-31T10:54:55.300 回答