Java 更改变量会导致更改对象
我用一些方法创建了一个Java 更改变量会导致更改对象,java,arrays,hashmap,Java,Arrays,Hashmap,我用一些方法创建了一个HashMap类。然后我创建这个类的一个对象(objectA),并在其中放入一个数组。然后我提取这个数组来对其进行一些更改,并将更改后的数组放入新的objectB。但是随着提取数组的改变,我的objectA也改变了!为什么会这样 以下是完整的工作示例: public class MyClass extends LinkedHashMap<String, int[]> { public static void main(String[] args) {
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;
}
}
公共类MyClass扩展LinkedHashMap{
公共静态void main(字符串[]args){
MyClass objectA=新的MyClass();
put(“somekey”,新int[]{1,2,3});
System.out.println(Arrays.toString(objectA.get(“somekey”));//[1,2,3]
MyClass objectC=objectA.myMethod();//我对objectA什么也没做
System.out.println(Arrays.toString(objectA.get(“somekey”));//[0,10,20]但是objectA已经改变了!
}
公共int[]获取值(字符串键){
int[]result=this.get(key);
返回结果;
}
公共值(字符串键,int[]值){
这个.put(键、值);
}
公共MyClass myMethod(){
MyClass objectB=新的MyClass();
//从hashmap获取数组
int[]values=this.getValues(“somekey”);
//现在我正在更改数组
对于(inti=0;i来说,这种行为是因为在Java中,每个对象都持有引用,而不是值。
那么,在你的情况下
objectA.put("somekey", new int[]{1,2,3});
将存储int数组的引用
然后,当您调用objectA.myMethod()
时,在myMethod()
中,您将获得相同的数组引用。
然后您修改了相同的数组,并使用另一个仍具有相同引用的键返回
因此,您的objectA.get(“somekey”)
已更改
有关更多信息,请检查以下问题:该行为是因为在Java中,每个对象都持有引用,而不是值。
那么,在你的情况下
objectA.put("somekey", new int[]{1,2,3});
将存储int数组的引用
然后,当您调用objectA.myMethod()
时,在myMethod()
中,您将获得相同的数组引用。
然后您修改了相同的数组,并使用另一个仍具有相同引用的键返回
因此,您的objectA.get(“somekey”)
已更改
有关更多信息,请检查此问题:您的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;
}
公共MyClass myMethod(){
MyClass objectB=新的MyClass();
int[]values=this.getValues(“somekey”);
int[]temp=Arrays.copyOf(值、值、长度);
for(int i=0;i您的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;
}
公共MyClass myMethod(){
MyClass objectB=新的MyClass();
int[]values=this.getValues(“somekey”);
int[]temp=Arrays.copyOf(值、值、长度);
对于(int i=0;我需要你的解释!要理解java的这一理念并不容易。在了解了什么是按值传递和按引用传递?以及java是如何处理这一问题的?我将阅读相关内容。但现在我不明白为什么java使用的是引用而不是值。java对象总是持有引用存储对象实例的内存不足。感谢您的解释!理解java的这一理念并不容易。在了解了什么是按值传递和按引用传递之后,您可以更好地理解这一点?java是如何处理这一点的?我将了解这一点。但现在我不明白java为什么要使用引用不是值。Java对象总是保存对象实例所在内存的引用。