Я використовую Concurrenthashmap, який зберігає об’єкти. Я хочу отримати цей об'єкт і змінити його, не змінюючи хеш-карту. Як мені це зробити? Далі мій код:
ConcurrentHashMap<String,Employee> dataStorage = new
ConcurrentHashMap<String,Employee>(10000);
dataStorage.put("Employee1", Employee1);
Я додав об’єкт типу Employee до HashMap. Тепер, коли я роблю get
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.