阅读 Map#get(Object key)
的 JavaDocs|我不太明白这些方法实际上返回了什么。 The quote
Returns the value to which the specified key is mapped, or
null
if this map contains no mapping for the key.
返回值是什么意思?它可能是作为映射对象的副本创建的新对象吗?我编写了以下简单程序:
public static void main (String[] args) throws java.lang.Exception
{
Map<Integer, MyClass> m = new HashMap<>();
m.put(1, new MyClass());
MyClass mc = m.get(1);
mc.i = 15;
System.out.println(m.get(1).i); //prints 15
}
private static class MyClass{
public int i = 10;
}
通过更改 get(Object key)
返回的对象的状态是否可靠?我更改了实际的映射对象,或者它是一个特定的实现和 Map
的任意实现。不应该拿着吗?
最佳答案
简短的回答,是的。
map 保留对添加到其中的对象的引用。因此,当您调用 get 时,您将获得对原始对象的引用,并且所做的任何更改都是永久性的。
文档状态 [1]: 注意:如果将可变对象用作映射键,则必须格外小心。如果对象的值以影响等于比较的方式更改,而对象是映射中的键,则未指定映射的行为。此禁令的一个特例是 map 不允许将自身包含为键。虽然允许映射将自身包含为值,但建议格外小心:在此类映射上不再明确定义 equals 和 hashCode 方法。
因此,即使他们注意到您可以更改映射对象,但如果在更改影响 equals 返回值的字段时用作键,则应牢记某些事项。
[1] http://docs.oracle.com/javase/7/docs/api/java/util/Map.html
关于java - 了解 map 获取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33866131/