我使用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类是错误的吗?
答案 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的相同实例。这是因为字符串文字被“实习”以便共享唯一的实例。