Java - предотвращение влияния HashMap на исходное значение - PullRequest
0 голосов
/ 09 января 2019

Я получаю объект из 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;. Я просто создам новый экземпляр и вручную скопирую нужные мне поля. Большое спасибо всем, кто помог!

1 Ответ

0 голосов
/ 09 января 2019

dog2 на самом деле dog1 экземпляр, из-за этого кода

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

код выше сделает dog2 псевдонимом для dog1, которые имеют ту же ссылку / указатель. чтобы исправить это нужно создать новый экземпляр для dog2

Dog dog2 = new Dog();
...