学习用 Java 创建HashMap 的克隆。我们将看到用于创建 HashMap 的浅拷贝 和深拷贝 的 java 程序。
更多参考:Java 克隆指南
创建 hashmap 浅克隆的最佳方法就是使用它的clone() 方法。它返回Map的浅表副本。键和值本身不会被克隆;并指向内存中与原始Map中相同的对象。
import java.time.LocalDate; import java.util.HashMap; public class JavaHashMapCloningExample { @SuppressWarnings("unchecked") public static void main(String[] args) { HashMap<Integer, Employee> employeeMap = new HashMap<>(); employeeMap.put(1, new Employee(1l, "Alex", LocalDate.of(1990, 01, 01))); employeeMap.put(2, new Employee(2l, "Bob", LocalDate.of(1990, 02, 01))); //Shallow clone HashMap<Integer, Employee> clonedMap = (HashMap<Integer, Employee>) employeeMap.clone(); //Same as employeeMap System.out.println(clonedMap); System.out.println("\nChanges reflect in both maps \n"); //Change a value is clonedMap clonedMap.get(1).setName("Charles"); //Verify content of both maps System.out.println(employeeMap); System.out.println(clonedMap); } }
程序输出。
{1=Employee [id=1, name=Alex, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]} Changes reflect in both maps {1=Employee [id=1, name=Charles, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]} {1=Employee [id=1, name=Charles, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]}
如果您希望对复制到克隆的 HashMap 的值进行少量自定义,或者您只想修改单个键值对的克隆过程,那么我们可以使用 Java 8 stream api。
在这种方法中,使用流 api 迭代 hashmap entryset,执行值的自定义,然后在新的 HashMap 中收集对。
HashMap<Integer, Employee> employeeMap = new HashMap<>(); employeeMap.put(1, new Employee(1l, "Alex", LocalDate.of(1990, 01, 01))); employeeMap.put(2, new Employee(2l, "Bob", LocalDate.of(1990, 02, 01))); // Shallow clone Map<Integer, Employee> clonedMap = employeeMap.entrySet() .stream() //perform customization .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // Same as employeeMap System.out.println(clonedMap);
程序输出。
{1=Employee [id=1, name=Alex, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]}
深度克隆 Java 对象最有效的方法是序列化。这同样适用于深度克隆 HashMap 。在这里,我们使用 Google Gson 库来序列化 HashMap 和反序列化以创建 HashMap 深拷贝。
HashMap<Integer, Employee> employeeMap = new HashMap<>(); employeeMap.put(1, new Employee(1l, "Alex", LocalDate.of(1990, 01, 01))); employeeMap.put(2, new Employee(2l, "Bob", LocalDate.of(1990, 02, 01))); //Deep clone Gson gson = new Gson(); String jsonString = gson.toJson(employeeMap); Type type = new TypeToken<HashMap<Integer, Employee>>(){}.getType(); HashMap<Integer, Employee> clonedMap = gson.fromJson(jsonString, type); System.out.println(clonedMap); //-------------------------------------- System.out.println("\nChanges DO NOT reflect in other map \n"); //Change a value is clonedMap clonedMap.get(1).setName("Charles"); //Verify content of both maps System.out.println(employeeMap); System.out.println(clonedMap);
程序输出。
{1=Employee [id=1, name=Alex, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]} Changes DO NOT reflect in other map {1=Employee [id=1, name=Alex, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]} {1=Employee [id=1, name=Charles, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]}
如果您对如何深度克隆 HashMap 或在 Java 中创建 HashMap 的浅表副本有疑问,请告诉我。
快乐学习!!
地址:https://www.cundage.com/article/shallow-deep-copy-hashmap.html