如何从hashmap获取对象的副本而不在Hashmap中修改其值

时间:2017-09-11 06:05:31

标签: java

我正在使用存储对象的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中存储的值?

4 个答案:

答案 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()

请在此处阅读clone()here

答案 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.