HashMap 的基础结构,必须掌握!("HashMap核心基础结构详解:开发者必备知识!")

原创
ithorizon 6个月前 (10-20) 阅读数 18 #后端开发

HashMap核心基础结构详解:开发者必备知识!

一、HashMap简介

HashMap 是 Java 中非常常用的一个数据结构,它基于散列(Hashing)原理实现。HashMap 允许我们以键值对(Key-Value)的形式存储数据,并提供了高效的查询、插入和删除操作。作为开发者,懂得 HashMap 的核心基础结构是至关重要的。

二、HashMap的数据结构

HashMap 的核心数据结构包括以下几个部分:

  • 数组:用于存储数据
  • 链表:用于解决哈希冲突
  • 红黑树:用于优化链表查询性能

三、数组

HashMap 底层采用了一个数组来存储数据,数组的每个元素是一个链表或者红黑树的根节点。数组的长度在 HashMap 初始化时指定,默认为 16。当数组中的元素数量大致有一定的比例(即负载因子)时,HashMap 会进行扩容操作,即创建一个更大的数组,并将原有元素重新散列到新数组中。

四、哈希函数

HashMap 使用哈希函数来确定元素的存储位置。哈希函数将键(Key)转换成数组索引。Java 中的 HashMap 使用以下哈希函数:

int hash = key.hashCode();

int index = hash & (arrayLength - 1);

其中,key.hashCode() 是键的哈希码,arrayLength 是数组的长度。通过取模运算,我们可以得到元素在数组中的索引位置。

五、链表

当两个不同的键经过哈希函数计算后得到相同的索引时,会出现哈希冲突。为了解决哈希冲突,HashMap 在数组的每个位置上维护了一个链表。当出现冲突时,新的元素会被添加到链表的末尾。在查找、插入和删除操作时,HashMap 会遍历链表以找到目标元素。

六、红黑树

当链表的长度超过一定阈值(默认为8)时,为了优化查询性能,HashMap 会将链表转换成红黑树。红黑树是一种自平衡二叉搜索树,可以保持元素的有序性,从而节约查询效能。在红黑树中,节点的颜色和旋转操作用于保持树的平衡。

七、HashMap的操作

HashMap 提供了以下几种常见操作:

  • put(K key, V value):插入键值对到 HashMap 中
  • get(K key):结合键获取对应的值
  • remove(K key):从 HashMap 中删除键值对
  • size():返回 HashMap 中元素的数量

八、put操作详解

以下是 put 操作的详细步骤:

  1. 计算键的哈希码,并确定其在数组中的索引位置;
  2. 如果数组在该索引位置上为空,则直接将键值对存储在该位置;
  3. 如果数组在该索引位置上不为空,则判断链表或红黑树中是否已存在相同的键;
  4. 如果存在相同的键,则更新对应的值;
  5. 如果不存在相同的键,则将新的键值对添加到链表或红黑树的末尾;
  6. 如果链表长度超过阈值,则将链表转换成红黑树;
  7. 如果元素数量大致有负载因子,则进行扩容操作。

九、get操作详解

以下是 get 操作的详细步骤:

  1. 计算键的哈希码,并确定其在数组中的索引位置;
  2. 如果数组在该索引位置上为空,则返回 null;
  3. 如果数组在该索引位置上不为空,则遍历链表或红黑树以查找目标键;
  4. 如果找到目标键,则返回对应的值;
  5. 如果未找到目标键,则返回 null。

十、remove操作详解

以下是 remove 操作的详细步骤:

  1. 计算键的哈希码,并确定其在数组中的索引位置;
  2. 如果数组在该索引位置上为空,则无需操作;
  3. 如果数组在该索引位置上不为空,则遍历链表或红黑树以查找目标键;
  4. 如果找到目标键,则从链表或红黑树中删除该节点;
  5. 如果链表或红黑树变为空,则将数组在该索引位置上的元素设置为 null;
  6. 如果链表长度小于阈值,则将红黑树转换成链表。

十一、总结

HashMap 是一种高效的数据结构,它基于散列原理实现。懂得 HashMap 的核心基础结构,包括数组、链表和红黑树,对于开发者来说非常重要。通过掌握 HashMap 的操作原理,我们可以更好地利用它来优化程序性能。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门