HashMap关键字

本文详细介绍了HashMap的数据结构,包括哈希桶、链表和红黑树,以及其常量定义如DEFAULT_INITIAL_CAPACITY、MAXIMUM_CAPACITY等。深入探讨了内部类Node和静态方法,如计算哈希值的hash方法。此外,还概述了HashMap的重要成员变量和方法,如getNode、putVal、resize和removeNode,以及如何在实现Map接口时覆盖特定方法以提供额外功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念关键字

哈希桶:数组
链表:单链表
红黑树

扩容
位运算
哈希碰撞
扰动函数

常量定义

DEFAULT_INITIAL_CAPACITY:默认初始容量,缺省为16;
MAXIMUM_CAPACITY:默认最大容量,缺省2的30次方;
DEFAULT_LOAD_FACTOR:默认加载因子,缺省0.75;
TREEIFY_THRESHOLD:桶容量阈值,超过则从链表转换为红黑树;
UNTREEIFY_THRESHOLD:桶容量阈值,低于该值则从红黑树退化为链表;
MIN_TREEIFY_CAPACITY:从链表转换为红黑树的最小数组容量;

内部类Node

实现接口Map.Entry。
成员包括:key,value,next(链表指针),hash。
LinkedHashMap中的静态内部类Entry派生自Node,而HashMap中的静态内部类TreeNode又派生自LinkedHashMap的Entry。
LinkedHashMap.Entry增加了成员before,after用来保证插入顺序;
HashMap.TreeNode增加了成员parent,left,right,prev以及red用来构造红黑树,平衡二叉树能够保证查找效率维持在一定的时间复杂度。

静态方法

hash:计算哈希值;如果key为null,则返回0,否则取key的hashCode,并与其无符号右移16位后做异或(让高位参与hash计算?);
comparableClassFor:判断参数的Class类型是否实现了Comparable接口;
compareComparables:键值比较;
tableSizeFor:计算桶数组的容量,通过无符号右移以及或操作找到最接近的大于给定容量的一个2的幂次方的容量值;

成员变量

table(Node< K, V >[]):哈希桶的数组,存放链表;长度为2的N次方;
loadFacctor(final float):加载因子,用于计算哈希桶数组元素数量的阈值;
threshold(int):元素容量阈值,元素数量超过阈值则扩容;
modCount:结构性改变的次数(改变了map的数量,或者重新hash了);用于容器遍历时的快速失败;

重点成员方法

getNode:先定位哈希桶在数组中的位置,然后定位元素在桶中的位置(区分链表和红黑树两种情况);
putVal:是否需要扩容,数组中对应位置的桶是否为空,对应桶是否红黑树,是否需要转为红黑树等等;
resize:初始化,或者二倍化;注意旧元素的置空,方便垃圾回收;
removeNode:移除节点;

一些package可见性的方法

package是缺省可见性。
以下三个方法用来给LinkedHashMap做回调,可以维持LinkedHashMap的插入顺序:
afterNodeAccess;
afterNodeInsertion;
afterNodeRemoval;
以下四个方法被设计用来给LinkedHashMap重写,用于链表和二叉树转换的时候调用:
newNode;
replacementNode;
newTreeNode;
replacementTreeNode;

从Map接口Override的一些方法

compute;
computeIfPresent;
computeIfAbsent;
merge;
replaceAll;
forEach;
这些方法大部分传入了Function或者Consumer之类的函数式接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值