gpt4 book ai didi

java - 改变变量会导致改变对象

转载 作者:行者123 更新时间:2023-12-01 20:52:37 25 4
gpt4 key购买 nike

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

}

最佳答案

这种行为是因为在 Java 中每个对象都保存引用,而不是值。所以,就你的情况而言

objectA.put("somekey", new int[]{1,2,3});

存储了int数组的引用。

然后,当您在 myMethod() 中调用 objectA.myMethod() 时,您将获得相同的数组引用。
然后,您修改了相同的数组,并使用仍具有相同引用的 anotherkey 键放回。

因此,您的 objectA.get("somekey") 已更改。

有关更多信息,请检查此问题:Is Java "pass-by-reference" or "pass-by-value"?

关于java - 改变变量会导致改变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42991509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com