在Java Map <Integer,Double []>中,我需要在获取和修改后放置Double []吗?

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这假设您正在使用线程安全的地图开始,当然......