本博文不针对源码做逐句解析,网上有很多,此文只针对hashmap较为重要的知识点进行归纳总结;
博客小白,文章为原创,里面一些个人的观点可能不太准确或严谨,若有问题欢迎各路大神批评指正
1. HashMap数据结构
HashMap是以数据加链表形式的一种数据结构,基础数组大小为16,也就是最初会初始化一个长度为16的数组,
每一个位置一般称之为一个哈希桶,用key值来计算桶的位置(计算key值的hashcode再通过扰动得出具体位置),
如果得出桶的位置一样则形成单链表,java8开始引入红黑树,当单链表长度达到8时,链表转化为红黑树;
而当单链表长度从大于等于8到小于6时,则重新转化为单链表,这种情况一般在扩容时较容易产生;
2. 源码中几个关键属性
static final float DEFAULT_LOAD_FACTOR = 0.75f;
加载因子:意思是当hashmap存储的键值对个数超过其桶数量的0.75时即扩容;如默认16,存储超过12个键值对时即扩容
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
控制链表和红黑树转化的阈值,需要注意的是链表长度等于8或6时就会发生转换
/**
* The smallest table capacity for which bins may be treeified.
* (Otherwise the table is resized if too many nodes in a bin.)
* Should be at least 4 * TREEIFY_THRESHOLD to avoid conflicts
* between resizing and treeification thresholds.
*/
static final int MIN_TREEIFY_CAPACITY = 64;
从注释中可以看出,该属性为最小转换树时的容量,也就是说当整个hashmap容纳键值对的量小于64时,不会发生转换;
treeBin中有一句代码:
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();
即当键值对数量小于64时不会将传入的链表转化为树,而是进行扩容操作;
实际上这种情况基本不可能产生,因为产