Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改变量会导致更改对象_Java_Arrays_Hashmap - Fatal编程技术网

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对象总是保存对象实例所在内存的引用。