Java - 防止 HashMap 影响原始值
Java - Prevent HashMap from Affecting Original Value
我正在从 HashMap 获取一个对象,对其进行修改,然后将其保存到不同键下的 HashMap 中。
但是,我的更改也会影响原始对象。
我的代码如下:
Dog.java:
public class Dog {
public String id = "";
public String name = "";
}
MyApp.java:
import java.util.*;
public class MyApp {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.id = "d1";
dog1.name = "dog1";
System.out.println(dog1.id); // d1
System.out.println(dog1.name); // dog1
HashMap<String, Dog> map = new HashMap<>();
map.put(dog1.id, dog1);
Dog dog2 = map.get(dog1.id);
dog2.id = "d2";
dog2.name = "dog2";
System.out.println(dog2.id); // d2
System.out.println(dog2.name); // dog2
map.put(dog2.id, dog2);
System.out.println(dog1.id); // d2
System.out.println(dog1.name); // dog2
System.out.println(dog2.id); // d2
System.out.println(dog2.name); // dog2
}
}
我记得读过 HashMaps 通过 reference/pointers 传递值。
如何防止对已修改对象的更改影响原始对象?
更新: 所以 dog2 = map.get(dog1.id);
行似乎等同于 Dog dog2 = dog1;
。我将只创建一个新实例并手动复制我需要的字段。非常感谢所有帮助过的人!
dog2
实际上是一个 dog1
实例,由于此代码
Dog dog2 = map.get(dog1.id);
以上代码将使 dog2
成为具有相同 reference/pointer 的 dog1
的别名。修复那些需要为 dog2
创建新实例的问题
Dog dog2 = new Dog();
我正在从 HashMap 获取一个对象,对其进行修改,然后将其保存到不同键下的 HashMap 中。 但是,我的更改也会影响原始对象。
我的代码如下:
Dog.java:
public class Dog {
public String id = "";
public String name = "";
}
MyApp.java:
import java.util.*;
public class MyApp {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.id = "d1";
dog1.name = "dog1";
System.out.println(dog1.id); // d1
System.out.println(dog1.name); // dog1
HashMap<String, Dog> map = new HashMap<>();
map.put(dog1.id, dog1);
Dog dog2 = map.get(dog1.id);
dog2.id = "d2";
dog2.name = "dog2";
System.out.println(dog2.id); // d2
System.out.println(dog2.name); // dog2
map.put(dog2.id, dog2);
System.out.println(dog1.id); // d2
System.out.println(dog1.name); // dog2
System.out.println(dog2.id); // d2
System.out.println(dog2.name); // dog2
}
}
我记得读过 HashMaps 通过 reference/pointers 传递值。
如何防止对已修改对象的更改影响原始对象?
更新: 所以 dog2 = map.get(dog1.id);
行似乎等同于 Dog dog2 = dog1;
。我将只创建一个新实例并手动复制我需要的字段。非常感谢所有帮助过的人!
dog2
实际上是一个 dog1
实例,由于此代码
Dog dog2 = map.get(dog1.id);
以上代码将使 dog2
成为具有相同 reference/pointer 的 dog1
的别名。修复那些需要为 dog2
Dog dog2 = new Dog();