java - 在Java Map <Integer, Double[]>中,是否需要在获取和修改后放置Double[]?

标签 java arrays collections

一个可能很蹩脚的快速问题。

在下面的代码中:

Map<Integer, Double[]> dataMap = new Map<Integer, Double[]>();
dataMap.put(1, new Double[]{100,100});
Double[] dob = dataMap.get(1);
dob[0] = 100;
dob[1] = 200;
dataMap.put(1, dob);

是否需要最后的“dataMap.put”指令?或者 dataMap.get(1) 会产生对数组的引用,然后在后面的语句中直接修改该数组。

我知道,在可变对象(例如 Map)的情况下,Map.get() 会给我所需对象的引用,但是有一个 Double 数组(其元素类型例如 Double 是不可变的)我不确定我是否得到了对 Map 中数组的引用。

谢谢!

最佳答案

不,最后的声明不是必需的 - 因为映射只包含对数组的引用,正如您所提到的。数组是一个可变对象,即使 Double 不是 - 它就像拥有一个带有 setName(String) 方法的对象 - 只是因为 String 是不可变的,容器类型不是。

请注意,如果您这样做,另一个线程1 可能会看到 一半 更改(即第一个元素设置为 100),而第二个元素设置为200. 可以吗?如果没有,您可以考虑创建一个数组:

Map<Integer, Double[]> dataMap = new HashMap<Integer, Double[]>();
dataMap.put(1, new Double[]{100,100});
// Other stuff...

// Replace value in map with a reference to a different array.
Double[] dob = new Double[] { 100, 200 };
dataMap.put(1, dob);

1 当然,这是假设您开始使用线程安全映射...

关于java - 在Java Map <Integer, Double[]>中,是否需要在获取和修改后放置Double[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844359/

相关文章:

java - 为什么在 Iterable 和 Collection 接口(interface)中都存在迭代器方法?

java - 比较单个二维数组中的两行

java - 无法在java中使用循环分配数组值

java - Vector 的填充时间比 ArrayList 少

c++ - Qt 5.3 : Accessing/returning/calling checkboxes that are created dynamically(? )

c - 尝试在 C 中打印矩阵时对函数的 undefined reference

java - 如何按今天/本周/本月对日期数组进行排序 - android

java - 多个组件 "linked"相互

java - JUnit 5 @ParamterizedTest {arguments} 与 {argumentsWithNames} 占位符

java - 在android studio中使用react-native编译android时出错