Използвам 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.