/ / Як отримати копію об'єкта з hashmap, не змінюючи його значення в Hashmap - java

Як отримати копію об'єкта з hashmap, не змінюючи її значення в Hashmap - java

Я використовую 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.