欢迎光临
我们一直在努力

Java HashMap 详解

一、核心结论

HashMap 是 Java 集合框架中最常用的 键值对(Key-Value)存储容器,基于「哈希表」实现,核心特点是:无序存储、键唯一(值可重复)、查询 / 增删效率高(平均时间复杂度 O (1)),是 Android 开发中存储配置、缓存数据、传递参数的首选。

本文从「底层原理、核心用法、常见问题、Android 实战」四个维度拆解,新手能看懂,同时覆盖面试高频考点。


二、HashMap 核心原理(通俗版)

1. 底层结构:数组 + 链表 / 红黑树(JDK 1.8+)

HashMap 的底层像一个「数组柜子」,每个柜子(数组索引)里可能挂着「链表」,当链表长度超过阈值(默认 8),会自动转成「红黑树」—— 这是为了平衡「数组查询快」和「链表增删快」的优点,解决哈希冲突。

核心概念拆解:
结构
作用
触发条件(JDK1.8)
数组(桶) 基础存储结构,通过哈希值计算索引,快速定位元素 初始化 HashMap 即创建
链表 解决「哈希冲突」(不同 Key 计算出相同索引),挂在数组索引下 索引冲突且链表长度 < 8
红黑树 当链表过长时(>8),转红黑树提升查询效率(O (n)→O (logn)) 链表长度 ≥8 且数组长度 ≥64

2. 核心流程:存值(put)& 取值(get)

(1)存值(put)流程(通俗版):
  • 计算哈希值:对 Key 做哈希运算,得到哈希值;
  • 计算数组索引:用哈希值对数组长度取模,得到元素要存放的数组索引;
  • 判断是否冲突:
    • 无冲突:直接把 Key-Value 放在该索引位置;
    • 有冲突:判断 Key 是否相同(equals 比较):
      • Key 相同:覆盖旧 Value;
      • Key 不同:挂到链表末尾(或红黑树);
  • 扩容判断:如果元素数量超过「数组长度 × 负载因子(默认 0.75)」,数组自动扩容(翻倍)。
  • (2)取值(get)流程(通俗版):
  • 计算哈希值:对 Key 做哈希运算;
  • 计算数组索引:定位到数组的具体索引;
  • 查找元素:
    • 索引位置是单个元素:直接返回 Value;
    • 索引位置是链表 / 红黑树:遍历 / 查找匹配的 Key,返回对应的 Value;
    • 无匹配 Key:返回 null。
  • 3. 关键参数(新手必知)

    参数
    默认值
    作用
    初始容量 16 数组的初始长度(必须是 2 的幂,如 16、32、64,方便计算索引)
    负载因子 0.75 扩容阈值比例:当元素数 ≥ 数组长度 × 0.75 时,触发扩容(平衡空间和效率)
    链表转红黑树 8 单个索引下链表长度 ≥8 时,转红黑树
    红黑树转链表 6 扩容 / 删除元素后,红黑树节点数 ≤6 时,转回链表

    三、HashMap 核心用法(实战示例)

    赞(0)
    未经允许不得转载:171主机测评 » Java HashMap 详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址