如何克隆 HashMap - 浅拷贝和深拷贝

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(479)   2023-06-26 07:54:18

学习用 Java 创建HashMap 的克隆。我们将看到用于创建 HashMap 的浅拷贝深拷贝 的 java 程序。

更多参考:Java 克隆指南

1. Clone HashMap——浅拷贝

1.1. HashMap 的 clone() 方法

创建 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]}

1.2.使用 Java 8 Stream API 克隆 HashMap

如果您希望对复制到克隆的 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]}

2、如何深度克隆HashMap

深度克隆 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

相关阅读

学习用 Java 创建HashMap 的克隆。我们将看到用于创建 HashMap 的浅拷贝 和深拷贝 的 java 程序。 更多参考:Java 克隆指南 1. Clone HashMap——浅拷...
Java HashMap 默认是不同步的。如果我们在多个线程正在添加和删除对的并发应用程序中从 HashMap 添加/删除键值对,我们最终可能会出现不一致的映射状态。学习同步 hashmap 和...
Java HashMap 是 Collections 框架 的成员,用于存储键值对。每个键映射到单个值,并且不允许重复键。在本教程中,我们将了解HashMap 如何在内部存储键值对以及它如何防止...
了解在 Java 中通过键、值和键值对比较两个散列映射的不同方法。此外,学习在允许或限制重复值的同时比较地图。 1.比较相同键和值的映射 1.1.使用 Map.equals() 默认情况下,Ha...
HashMap 基于哈希算法工作,根据 Java 文档 HashMap 有以下四个构造函数, 构造函数 描述 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap
在上一篇文章中,我向您展示了如何在 Java 8 中通过键对 Map 进行排序,今天,我将教您使用 Java 如何通过值对 Map 进行排序 8 个特征,例如lambda 表达式、方法引用、流和...
Java中的LinkedHashMap用于存储键值对,非常类似于HashMap类。不同之处在于 LinkedHashMap 维护插入其中的元素的顺序,而 HashMap 是无序的。 在这个 Ja...
Java 教程中的 HashMap 迭代展示了如何在 Java 中迭代 HashMap。 Java哈希表 哈希表是一个存储键值对的容器。每个键都与一个值相关联。 HashMap 中的键必须是唯一...
对于入门级 Java 程序员,您可以期待这个关于 Hashtable 与哈希图。尽管当您了解其他概念(例如 hashmap 是如何工作的,但是在从我的博客读者那里得到许多准备或工作在初级水平的问...
在 Java 中,数组表克隆() 方法创建列表的浅表副本,其中仅复制对象引用。如果我们更改第一个数组列表中的列表项的对象状态, 更改的对象状态也将反映在克隆列表中。 为了防止更改反映在两个列表中...