欢迎访问宙启技术站
智能推送

Java中HashMap类的put方法详解

发布时间:2023-06-23 17:17:25

HashMap是Java中常用的一种数据结构,它需要了解的入门知识就是put方法。put方法是HashMap类中最重要的方法之一,它可以往HashMap中添加key-value,本文就对HashMap类的put方法进行详细解析。

HashMap类的基本概念

HashMap类是一种键-值映射的数据结构,键是 的,用于查找该key对应的值。存储键值对的容器称为哈希表,该容器内的元素是基于键而被存储,通过键可以直接访问到它的值。

在HashMap中,键是Object类型的,因此可以使用任何Java对象作为键(需要重写hashCode和equals方法),而值也是Object类型的,可以是任何对象。

HashMap在Java中是非线程安全的,因此在多线程环境下不宜使用HashMap。

HashMap类的put方法

HashMap类的put方法的方法签名为:

public V put(K key, V value)

其中,K是键的类型,V是值的类型。该方法的作用就是将指定的键值对映射添加到HashMap中。如果该键已经存在于映射中,则将对应的值替换为新值,并返回旧值。

该方法的返回值是旧值,如果没有旧值,则返回null。

实际上,HashMap的put方法是基于哈希表实现的,下面详细解析一下HashMap的put方法内部实现。

HashMap中哈希表的实现原理

在HashMap中,每个键值对会被分配到一个桶中,如果桶中已经存在一个键值对,则将其连接到该桶的链表中,这条链表称为桶中的链。因为每个桶的结构都是相同的,所以可以将HashMap的桶视为一个数组。

每个键值对的键都有一个哈希值,哈希值是通过键的hashCode方法计算得到的。哈希值真正的作用是指导哈希表如何组织桶,并且将相关联的键值对放入同一桶中。

对于每个桶,它的链表是无序的,因此HashMap并不保证插入顺序和迭代顺序相同。但是,它保证键的顺序是不变的。

put方法的实现

HashMap的put方法是基于哈希表实现的。首先,它会对指定的键求哈希值,然后将键值对插入到桶中。如果桶中已经存在键值对,则需要遍历链表,找到该键并替换其对应的值。

具体而言,put方法会执行以下步骤:

1.检查HashMap是否已经初始化。如果未初始化,则先调用初始化方法init().该方法会选取初始容量(默认为16)和负载因子(默认为0.75),创建一个初始哈希表。

2.计算键的哈希值,并计算需要插入到哪个桶中。如果该桶中没有键值对,则直接插入新的键值对。

3.如果桶中已经存在一个键值对,则需要遍历链表,查找指定的键,如果找到了,则用新的值替换旧的值,并返回旧的值。如果没有找到键,则在链表的结尾处添加键值对。

4.在插入完成后,检查哈希表是否需要重新哈希。如果当前哈希表中的键值对数量超过了负载因子与哈希表容量的乘积,则需要重新哈希,即将哈希表的容量扩大一倍,并将所有键值对重新放入新的哈希表中。

5.返回旧的值,或null。

重点介绍一下重新哈希(rehash)的过程。当HashMap中存储的键值对数量超过负载因子与哈希表容量的乘积时(即默认的0.75与容量的乘积),需要对HashMap进行扩容。扩容会创建一个新的哈希表,容量是原来的两倍,然后将所有键值对重新插入到新的哈希表中。

重新哈希的过程是建立一个新的,两倍大小的哈希表,然后使用putAll()方法将旧的表中的键值复制到新哈希表中。在将每个键值对插入新的哈希表时,会重新计算哈希值,从而将其分配到新的桶中。

为什么要重新哈希呢?如果HashMap中存储的键值对数量过多,会导致每个桶中的键值对数量过多,从而影响到性能。因此,通过扩容可以让HashMap保持高效性能。

总结

本文对HashMap类的put方法进行了详细的解析。通过该方法,可以了解到HashMap中哈希表的实现原理,以及当HashMap中存储的键值对数量超过负载因子与哈希表容量的乘积时,需要对HashMap进行扩容的原因。

HashMap是Java中常用的一种数据结构,put方法是其中最重要的方法之一。当使用HashMap时,需要注意线程安全问题和键值对的哈希值计算。正确使用HashMap可以提高程序的性能和可维护性。