HashMap关键字

概念关键字

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

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

常量定义

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之类的函数式接口。

猜你喜欢

转载自blog.csdn.net/achang07/article/details/79395921
今日推荐