我正在使用存储对象的Concurrenthashmap。我想获取该对象并在不修改hashmap的情况下修改它。我该怎么做? 以下是我的代码:
ConcurrentHashMap<String,Employee> dataStorage = new
ConcurrentHashMap<String,Employee>(10000);
dataStorage.put("Employee1", Employee1);
我在HashMap中添加了Employee类型的对象。 现在,当我做一个得到
Employee employee1 = dataStorage.get("Employee1");
如果我修改employee1
,更新的对象将存储在HashMap
如何修改employee1
而不影响HashMap
中存储的值?
答案 0 :(得分:2)
您可以制作对象employee
的深层副本,即实际创建新对象,而不是仅传递employee
对象的内存位置。
要了解有关deep copy的更多信息,请阅读此处。
你可以使用这样的东西来做到这一点:
/**
* 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;
}
}
}
有关详情,请阅读here。
您也可以通过实施Cloneable来使用clone()
。
答案 1 :(得分:0)
制作Employee
对象的深层副本。这里的一种可能性是将复制构造函数添加到Employee
类中,该类复制字段:
class Employee {
private String name;
private int ID;
// other fields...
public Employee(Employee other) {
this.name = other.name;
this.ID = other.ID;
// ...
}
}
正如您所正确观察到的那样,如果您对直接从hashmap获得的Employee
对象进行一些修改,它将会&#34;坚持&#34;那里。在我使用Java的过程中,这种行为通常是我想要的,但希望这个答案是您需要考虑的一种解决方法。
答案 2 :(得分:0)
Employee Employee2 = Employee1.clone();
dataStorage.put("Employee1", Employee2);
我希望这会奏效。
答案 3 :(得分:-1)
ConcurrentHashMap<String,Employee> dataStorage = new
ConcurrentHashMap<String,Employee>(10000);
dataStorage.put("Employee1", Employee1.clone());
In most of the cases, the shallow copy should work.