HashMap原理

89 阅读3分钟

HashMap原理

一、简介

HashMap是Java中最常用的集合类之一,它实现了Map接口,用于存储键值对。HashMap的底层实现是基于哈希表的,因此它的查询速度非常快。但是,它的缺点是遍历顺序是不确定的。

二、基本概念

1. 哈希表

哈希表是一种数据结构,用于存储键值对。它通过哈希函数将键映射到桶中,然后将桶中的值映射到桶的位置。当需要查找一个键时,只需要计算该键的哈希值,然后使用该哈希值来确定该键所在的桶。如果该桶中已经存在该键的值,则直接返回该值;否则,将该键添加到该桶中,并将其值设置为一个新的节点。

2. 桶

桶是哈希表中的一个单元,用于存储键值对。每个桶都有一个唯一的哈希值,由哈希函数计算得出。桶的数量通常是一个大于0的整数,称为桶的个数(bucket count)。在Java中,默认情况下,桶的个数为16。

3. 链表和红黑树

为了维护有序性,HashMap使用了链表和红黑树两种数据结构来维护元素的有序性。当链表的长度超过一定阈值时,链表就会转化为红黑树。

三、工作原理

1. 初始化

当我们创建一个HashMap对象时,它会进行以下操作:

  • 调用构造函数创建一个初始容量为16的数组;
  • 对于数组中的每个元素,调用newNode()方法创建一个新的Node对象;
  • 将数组中的每个元素都初始化为null

2. 插入元素

当我们向HashMap中插入一个键值对时,会执行以下操作:

  • 首先计算键的哈希值,然后使用哈希值来确定对应的桶;
  • 如果该桶中已经存在该键的值,则更新该键的值;否则,在该桶中添加一个新的节点,并将该节点的键设置为该键,值设置为该值;
  • 如果该桶的大小超过了负载因子(load factor)与当前元素的个数之积,则将该桶转换为红黑树;否则,将该元素添加到链表中。

3. 获取元素

当我们从HashMap中获取一个键对应的值时,会执行以下操作:

  • 首先计算键的哈希值,然后使用哈希值来确定对应的桶;
  • 如果该桶中存在该键的值,则返回该值;否则,返回null

4. 删除元素

当我们从HashMap中删除一个键值对时,会执行以下操作:

  • 首先计算键的哈希值,然后使用哈希值来确定对应的桶;
  • 如果该桶中存在该键的值,则删除该节点;否则,不执行任何操作;
  • 如果该桶的大小小于负载因子(load factor),并且包含至少两个元素,则将该桶转换为红黑树;否则,不执行任何操作。