我从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通过引用/指针传递值。

如何防止对修改后的对象所做的更改影响原始对象?

更新:所以看来行dog2 = map.get(dog1.id);等效于Dog dog2 = dog1;。我将创建一个新实例,然后手动复制所需的字段。非常感谢所有帮助的人!

最佳答案

由于此代码,dog2实际上是一个dog1实例

Dog dog2 = map.get(dog1.id);


上面的代码将使dog2成为具有相同引用/指针的dog1的别名。解决那些需要为dog2创建新实例的问题

Dog dog2 = new Dog();

10-08 19:56