【问题标题】:Java - Prevent HashMap from Affecting Original ValueJava - 防止 HashMap 影响原始值
【发布时间】:2019-06-03 19:20:21
【问题描述】:

我从 HashMap 中获取一个对象,对其进行修改,然后将其保存到 HashMap 中的不同键下。 但是,我的更改也会影响原始对象。

我的代码如下:

狗.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;。我将创建一个新实例并手动复制我需要的字段。非常感谢所有帮助过的人!

【问题讨论】:

  • 你必须创建一个 new 对象
  • 听起来你想在地图上放两条狗。但你只创造了一个。你只是在拖着他走。

标签: java hashmap pass-by-reference


【解决方案1】:

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

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

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

Dog dog2 = new Dog();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多