<aside> 👉🏼 前言

本文也是自己在学习成长中整理笔记,特分享给佬友们笔记内容,如果深入源代码还是需要自己慢慢分析!

</aside>

原贴链接

https://www.lik.cc/archives/hashMap


1. HashMap 的基本结构

1.1 数据结构组成

HashMap 内部主要依赖以下几部分来存储数据:

大白话:

想象一个文件柜(数组),每个抽屉(桶)里可能放着一串文件(链表),而当文件太多时,会用目录索引(红黑树)快速查找。

1.2 核心成员变量

展示代码图片

基础变量.webp1544×1350 114 KB

代码解释:


// 初始容量,默认 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

// 默认负载因子,控制扩容阈值
static final float DEFAULT_LOAD_FACTOR = 0.75f;

// 链表长度达到8时转换为红黑树
static final int TREEIFY_THRESHOLD = 8;

// 红黑树节点数小于6时退化为链表
static final int UNTREEIFY_THRESHOLD = 6;

// 存储键值对的数组
transient Node<K,V>[] table;

// 当前存储的键值对数量
transient int size;

最佳实践:

当预估数据量较大时,构造时指定合适的初始容量,能有效减少扩容次数,从而提升性能:


Map<String, Integer> map = new HashMap<>(100);

1.3 示例图

2068×1114 77 KB