IdentityHashMap返回不正确的值
据我了解,下面的代码应该打印false
因为它是做基于identity
的比较。
但是,当我运行下面的代码它打印true
:
public class Test1 { public static void main(String[] args) { IdentityHashMap m = new IdentityHashMap(); m.put("A", new String("B")); System.out.println(m.remove("A", new String("B"))); } }
有人能帮我理解这种行为吗?
实际上,您在JDK中遇到了一个错误,请参阅JDK-8178355 。 IdentityHashMap
没有通过默认方法添加到Map
的remove(K,V)
方法的自定义实现,这是导致此问题的原因。
你把 “A”,新的“B”
您删除 “A”,新的“B”
所以,是的,你假设这个IdentityHashMap不应该删除该值看起来是正确的。
但是,您正在使用基本 AbstractMap中的remove(key, value)
方法,该方法不会被这个特定的子类覆盖!
所以,虽然javadoc说:
该类使用散列表实现Map接口,比较键(和值)时使用引用相等来代替对象相等。
(和值)部分(可能)仅用于插入键/值对。
所以,重要的部分又来自javadoc:
这个类不是一个通用的Map实现! 虽然这个类实现了Map接口,但是它故意违反了Map的通用契约,这个约定在比较对象时要求使用equals方法。 此类仅用于需要引用相等语义的罕见情况。
我(可能是自以为是)外卖:这个class是一个非常特殊的事情。 它有一个非常明确,狭隘的目的。 你发现了一个崩溃的例子。 (我不觉得奇怪:当你“改变”语义,但决定重新使用现有的代码,几乎是不可避免的遇到这种不一致)。
这可能被视为错误; 而另一个答案证实:这是一个错误 !