oba*_*iro 8 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);
Run Code Online (Sandbox Code Playgroud)
最后一个"dataMap.put"指令是否必要?或者dataMap.get(1)是否会产生对数组的引用,然后在后面的语句中直接修改它.
我知道,在可变对象(例如Map)的情况下,Map.get()会给我对所需对象的引用,但是有一个Doubles数组(其元素类型例如Double是不可变的)我不确定我是否在Map中获取对数组的引用.
谢谢!
Jon*_*eet 17
不,最后的声明是没有必要的 - 因为地图只包含对数组的引用,正如您所提到的.数组是一个可变对象,即使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);
Run Code Online (Sandbox Code Playgroud)
1这假设您正在使用线程安全的地图开始,当然......