在Java映射中<;整数,双精度[]>;,获取和修改后是否需要放置双精度[]?

在Java映射中<;整数,双精度[]>;,获取和修改后是否需要放置双精度[]?,java,arrays,collections,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); Map dataMap=newmap(); put(1,

这是一个很快的问题,可能有点站不住脚

在以下代码中:

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);
Map dataMap=newmap();
put(1,新的Double[]{100100});
Double[]dob=dataMap.get(1);
dob[0]=100;
dob[1]=200;
dataMap.put(1,dob);
是否需要最后一个“dataMap.put”指令?或者dataMap.get(1)是否会生成对数组的引用,该数组将在后面的语句中直接修改

我知道,在可变对象(例如Map)的情况下,Map.get()将为我提供对所需对象的引用,但是对于一个双精度数组(其元素类型例如
Double
是不可变的),我不确定是否在映射中获得了对该数组的引用


谢谢

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

请注意,如果执行此操作,另一个thread1可能会看到一半的更改(即将第一个元素设置为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);
Map dataMap=newhashmap();
put(1,新的Double[]{100100});
//其他东西。。。
//用对不同数组的引用替换映射中的值。
Double[]dob=新的Double[]{100200};
dataMap.put(1,dob);


1这是假设您使用的是线程安全映射,当然……

Double本身是不可变的,但这与数组无关

把每一个
Double
想象成一个坚不可摧的盒子。即使这些盒子是坚不可摧的,你仍然可以扔掉它们,并用其他的东西来代替它们