/ / Как да получите копие на обект от hashmap, без да променяте стойността му в Hashmap - java

Как да си направите копие на обекта от hashmap без да променяте стойността му в Hashmap - java

Използвам Concurrenthashmap, който съхранява обекти. Искам да получа този обект и да го променя, без да променя хешмапа. Как го правя? Следва моят код:

ConcurrentHashMap<String,Employee> dataStorage = new
ConcurrentHashMap<String,Employee>(10000);
dataStorage.put("Employee1", Employee1);

Бях добавил обект от тип Служител към HashMap. Сега, когато правя

Employee employee1 = dataStorage.get("Employee1");

Ако модифицирам employee1, актуализираният обект се съхранява в HashMap

Как мога да променя employee1 без да засяга стойността, съхранявана в HashMap?

Отговори:

2 за отговор № 1

Можете да направите дълбоко копие на обекта employee т.е. всъщност създайте нов обект, а не просто да прехвърлите паметта на employee обект.

За да научите повече за това дълбоко копие прочетете тук.

Можете да го направите, като използвате нещо подобно:

/**
* This method makes a "deep clone" of any object it is given.
*/
public static Object deepClone(Object object) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

За повече можете да четете тук.

Също така можете да използвате clone() чрез внедряване на Cloneable.

Прочетете тук за клонинг () или тук.


0 за отговор № 2

Направете дълбоко копие на Employee обект. Една от възможностите тук би била да добавите конструктор за копиране към вашия Employee клас, който копира над полетата:

class Employee {
private String name;
private int ID;
// other fields...

public Employee(Employee other) {
this.name = other.name;
this.ID = other.ID;
// ...
}
}

Както правилно забелязахте, ако направите някаква модификация на Employee обект, който получавате директно от хешмапа,там ще "залепи". По време на моя живот, използвайки Java, това поведение обикновено е това, което исках, но се надявам този отговор да е един от начините, които трябва да вземете предвид.


0 за отговор № 3
Employee Employee2 = Employee1.clone();
dataStorage.put("Employee1", Employee2);

Надявам се, че това ще работи.


-1 за отговор № 4
ConcurrentHashMap<String,Employee> dataStorage = new
ConcurrentHashMap<String,Employee>(10000);
dataStorage.put("Employee1", Employee1.clone());

In most of the cases, the shallow copy should work.