java - 了解 map 获取方法

标签 java dictionary

阅读 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;
}

DEMO

通过更改 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/

相关文章:

java - 为什么我对 winapi GetWindowPlacement 的调用失败(使用 JNA)?

Java 将一个类转换为另一个类

java - 容纳给定人员所需的最少汽车

r - 在 R 中的状态 map 上绘制条形图

dictionary - Golang 创建一片 map

python - 按添加顺序为字典分配值

java - 无法部署,上下文文件损坏

Java 执行器服务 :- Notify a thread to wake up when an event occurs

python - 有没有办法将元素列表映射到字典而无需循环?

python - 如何将字典中的值提取到数组中