HashMap源码解析(一)
程序员文章站
2021-12-25 10:57:08
...
本文以jdk1.8为例分析HashMap,不再考虑和以前版本的比较。
1、成员变量
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
HashMap的默认大小值(也即是16)。其中注释提到了,大小必须是2的次幂,原因简单来说是为了防止哈希冲突,保证分布均匀,详细解释可以参考这篇文章https://blog.csdn.net/zjcjava/article/details/78495416 这里只做一个文字说明:
hashmap是以数组存储,数组的索引是存储的key的hash值和(数组大小-1)求与运算,假设hashmap的大小是2的次幂,那么这个值减1的二进制后几位上的值都会是1,这就保证了它和key的hash值求与运算的时候,key的hash值后几位是保持不变的,这样,只要输入的key值是均匀的,那么最后在hashmap中存储的结果其分布就是均匀的。
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
DEFAULT_LOAD_FACTOR 装载因子,默认为0.75,指的是当使用空间大于容量的0.75倍时,就会进行扩容,至于为什么会是0.75这个值,可自行百度或参考https://www.jianshu.com/p/64f6de3ffcc1。
/**
* The bin count threshold for using a tree rather than list for a
* bin. Bins are converted to trees when adding an element to a
* bin with at least this many nodes. The value must be greater
* than 2 and should be at least 8 to mesh with assumptions in
* tree removal about conversion back to plain bins upon
* shrinkage.
*/
static final int TREEIFY_THRESHOLD = 8;
TREEIFY_THRESHOLD 涉及到jdk对hashmap进行的一次优化:hashmap底层以数组存储,而每个数组元素又以链表的形式存在,如果链表的长度大于TREEIFY_THRESHOLD 这个值,链表结构就会转化为树结构。
上一篇: lnmp论坛文档