HashMap 的 put() 和 get() 方法工作原理

在 Java 中,HashMap 是一种非常常用的数据结构,它允许我们通过键(key)来快速存取值(value)。HashMap 实现了 Map 接口,并提供了高效的键值对存储机制。本文将详细介绍 HashMap 的 put() 和 get() 方法的工作原理。

1. 基础知识

在开始之前,我们需要了解一些基础知识:

  • 键值对:HashMap 存储的数据类型是键值对形式。
  • 哈希码:每个键都有一个哈希码,这是通过调用 hashCode() 方法得到的。
  • 哈希函数:用于将哈希码映射到数组索引的函数。
  • 负载因子:HashMap 的默认负载因子是 0.75,它决定了何时需要进行扩容。
  • 初始容量:HashMap 的默认初始容量是 16。

2.put()方法详解

2.1 哈希码计算

当调用 put() 方法时,首先需要计算键的哈希码。这通常是通过调用键对象的 hashCode() 方法完成的。

2.2 索引计算

计算出哈希码后,需要将它映射到数组中的一个索引。HashMap 使用以下公式计算索引:

java

深色版本

1int index = (hash ^ (hash >>> 16)) & (table.length - 1);

这里使用了哈希码的一部分,并进行了位运算,以确保分布均匀。

2.3 检查容量

在将键值对放入数组之前,HashMap 会检查当前容量是否足够。如果元素数量接近于最大容量(由负载因子和初始容量决定),则会触发扩容操作。

2.4 插入节点

  • 查找或添加节点:根据计算出的索引,HashMap 将尝试找到对应的节点。如果索引处为空,那么这是一个新的位置,可以直接插入新节点。如果索引处已经有节点,HashMap 会遍历该位置上的链表或红黑树,查找是否有相同的键存在。
  • 更新或添加节点:如果找到了相同的键,那么更新对应的值。如果没有找到相同的键,那么在链表头部或红黑树中添加新节点。

2.5 处理哈希冲突

如果在同一个索引位置上有多个节点,HashMap 使用链表或红黑树来存储这些节点。如果链表长度超过了阈值(默认为8),则会将链表转换为红黑树以提高搜索效率。

2.6 扩容

当 HashMap 的元素数量达到某个阈值时(默认是数组容量乘以负载因子0.75),HashMap 会进行扩容。扩容通常会创建一个新的数组,其容量是原来的两倍,并将原有数组中的所有元素重新散列到新的数组中。

2.7 返回旧值

put() 方法会返回与键关联的旧值,如果没有旧值,则返回 null。

3.get()方法详解

3.1 哈希码计算

与 put() 方法类似,get() 方法也需要计算键的哈希码。

3.2 索引计算

使用与 put() 相同的方法计算索引。

3.3 查找节点

根据计算出的索引,HashMap 将尝试找到对应的节点。如果索引处为空,那么表示该键不存在。如果索引处有节点,HashMap 会遍历该位置上的链表或红黑树,查找是否有相同的键存在。

3.4 返回值

如果找到了匹配的键,则返回对应的值;如果没有找到匹配的键,则返回 null。

4. 示例代码

下面是一个简单的示例,展示如何使用 put() 和 get() 方法:

java

深色版本

1import java.util.HashMap;
2
3public class HashMapExample {
4    public static void main(String[] args) {
5        HashMap<String, Integer> map = new HashMap<>();
6
7        // 添加键值对
8        map.put("one", 1);
9        map.put("two", 2);
10        map.put("three", 3);
11
12        // 获取值
13        int value = map.get("two");
14        System.out.println(value); // 输出 2
15
16        // 更新值
17        Integer oldValue = map.put("two", 20); // oldValue 将会是 2
18        System.out.println("Old value: " + oldValue); // 输出 2
19
20        // 再次获取值
21        value = map.get("two");
22        System.out.println(value); // 输出 20
23    }
24}

5. 总结

HashMap 的 put() 和 get() 方法是其核心功能,它们通过计算哈希码和索引来快速地存储和检索数据。理解这些方法的内部工作原理对于有效地使用 HashMap 至关重要。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值