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没有通过默认方法添加到Mapremove(K,V)方法的自定义实现,这是导致此问题的原因。

“A”,新的“B”

删除 “A”,新的“B”

所以,是的,你假设这个IdentityHashMap不应该删除该值看起来是正确的。

但是,您正在使用基本 AbstractMap中的remove(key, value)方法,该方法不会被这个特定的子类覆盖!

所以,虽然javadoc说:

该类使用散列表实现Map接口,比较键(和值)时使用引用相等来代替对象相等。

(和值)部分(可能)仅用于插入键/值对。

所以,重要的部分又来自javadoc:

这个类不是一个通用的Map实现! 虽然这个类实现了Map接口,但是它故意违反了Map的通用契约,这个约定在比较对象时要求使用equals方法。 此类仅用于需要引用相等语义的罕见情况。

我(可能是自以为是)外卖:这个class是一个非常特殊的事情。 它有一个非常明确,狭隘的目的。 你发现了一个崩溃的例子。 (我不觉得奇怪:当你“改变”语义,但决定重新使用现有的代码,几乎是不可避免的遇到这种不一致)。

可能被视为错误; 而另一个答案证实:这是一个错误 !