一个可能很蹩脚的快速问题。
在下面的代码中:
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/