更改变量会导致更改对象

时间:2017-03-24 04:37:02

标签: java arrays hashmap

我用一些方法创建了一个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;
}

}

2 个答案:

答案 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;
}