我用一些方法创建了一个HashMap
类。然后我正在创建这个类的对象(objectA
)并将数组放入其中。然后我将提取此数组以对其进行一些更改并将更改的数组放入新的objectB
。但是通过更改提取的数组,我的objectA
也发生了变化!为什么会这样?
以下是完整的工作示例:
public class MyClass extends LinkedHashMap<String, int[]> {
public static void main(String[] args) {
MyClass objectA = new MyClass();
objectA.put("somekey", new int[]{1,2,3});
System.out.println(Arrays.toString(objectA.get("somekey"))); // [1,2,3]
MyClass objectC = objectA.myMethod(); // I did nothing with my objectA
System.out.println(Arrays.toString(objectA.get("somekey"))); //[0,10,20] but objectA has changed!
}
public int[] getValues(String key){
int[] result = this.get(key);
return result;
}
public void putValues(String key, int[] values){
this.put(key, values);
}
public MyClass myMethod(){
MyClass objectB = new MyClass();
//getting array from hashmap
int[] values = this.getValues("somekey");
//now I'm changing the array
for (int i=0; i<values.length; i++){
values[i] = i*10;
}
// and my objectA(this) has been changed!
objectB.put("anotherkey", values);
return objectB;
}
}
答案 0 :(得分:2)
行为是因为在Java中,每个对象都包含引用,而不是值。 所以,在你的情况下
objectA.put("somekey", new int[]{1,2,3});
存储了int array
。
然后,当您调用objectA.myMethod()
时,在myMethod()
中,您将得到相同的数组引用。
然后你修改了相同的数组,并使用anotherkey
键重新推出,该键仍具有相同的引用。
因此,您的objectA.get("somekey")
已更改。
有关详情,请查看此问题:Is Java "pass-by-reference" or "pass-by-value"?
答案 1 :(得分:1)
您的for
循环直接修改objectA
中存储的整数数组。您可以通过复制数组来获得所需的行为:
public MyClass myMethod(){
MyClass objectB = new MyClass();
int[] values = this.getValues("somekey");
int[] temp = Arrays.copyOf(values, values.length);
for (int i=0; i<values.length; i++){
temp[i] = i*10;
}
objectB.put("anotherkey", temp);
return objectB;
}