通过Map.put(K,V)添加值时,是否必须通过Map.get(K)返回相同的实例?

Ada*_*ter 5 java collections map semantics

假设你有这个代码:

Map<Foo, Bar> map = new HashMap<Foo, Bar>();

Foo foo = new Foo();
Bar bar = new Bar();
map.put(foo, bar);

Bar barReturned = map.get(foo);
Run Code Online (Sandbox Code Playgroud)

Java需要barReturned == bar吗?也就是说,它的Java 需要的是barReturned相同的实例作为bar?如果没有,预计会有什么语义?

Javadoc中表明,barReturned == bar必须是真实的,但我不是100%肯定的是:

V get(Object key)

返回指定键映射到的值,或者null此映射是否不包含键的映射.

更正式地,如果此映射包含从键映射k到一个值v,使得(key==null ? k==null : key.equals(k)),则此方法返回v; 否则它会返回null.(最多可以有一个这样的映射.)

如果此映射允许null值,则返回值null 不一定表示映射不包含键的映射; 地图也可能明确地将密钥映射到null.containsKey操作可用于区分这两种情况.

参数:

key - 要返回其关联值的键

返回:

值来指定键映射,或者null如果此映射不包含该键的映射关系

(强调我的)

编辑:据我所知,Map与标准库捆绑在一起的实现遵循barReturned == bar语义.我想知道的是,根据文档是否需要这种行为.例如,如果我编写自己的实现类,我是否还必须遵守这些语义Map

Jig*_*shi 0

class Foo{

}
class Bar{

}
public class MapDemo {
    public static void main(String[] args) {
        Map<Foo,Bar> map = new HashMap<Foo,Bar>();
        Foo foo = new Foo();
        Bar bar = new Bar();
        map.put(foo, bar);
        System.out.println(bar == map.get(foo));
    }
}
Run Code Online (Sandbox Code Playgroud)

返回

HashMap实现了Map,但没有这样写。

  /**
  137        * Returns the value of the mapping with the specified key.
  138        * 
  139        * @param key
  140        *            the key.
  141        * @return the value of the mapping with the specified key, or {@code null}
  142        *         if no mapping for the specified key is found.
  143        */
Run Code Online (Sandbox Code Playgroud)

但几乎每个实现都会这样做,我的意思是它维护相同的对象

  • 这只是确认了当前版本的 JVM 和用户定义的类的建议。它并不能证明这种行为是否是标准所要求的。 (3认同)