java HashMap源码解析

/**
* The default initial capacity - MUST be a power of two.
*/
DEFAULT_INITIAL_CAPACITY :
是指HashMap容器的初始大小,MUST be a power of two意思是必须是2的幂次方,二进制格式中,1向左移动4位,
也就是0001 --> 1 0000,即2^4=16。为什么初始容量是16而不是4,8或其他呢?因为16的索引是0~15,在JDK中,
都是用2进制的10进制数%16,结果在0~15之间。HashMap通过key的hashcode值,来进行位运算,在2的幂次方的情
况下,length-1的所有二进制位全是1,hashCode码&(length - 1)的结果取决于hashCode本身,如果hashCode是均
匀的,就可以减少hash碰撞情况(一个hash对应多个字符串),同时汇编处理的进制都是16进制,Java的底层是C,C
的底层是汇编,越接近底层开发效率越快,所以初始容量是16位

MAXIMUM_CAPACITY:
是指容量的极限值,默认设置为2^31

DEFAULT_LOAD_FACTOR:
是指负载因子,默认为0.75f。负载因子的存在是非常重要的,由于初始化HashMap的容量大小是固定的,当存储的数据
超过最大值*负载因子,即16*0.75=12并且这个位置已经有别的数据存在,将在当前容量的基础上进行扩容(如果没有别
的数据是个空位就不会扩容)。JDK1.7版本是使用了rehash方法,创建新的链表,如果在新链表的数组索引位置相同,则
链表元素会倒置。而JDK1.8版本中,链表元素相对位置没有变化, 实际是对对象的内存地址进行操作。

TREEIFY_THRESHOLD :
是指节点数,当一个元素被添加到至少有8(默认值)个节点的桶中时,桶中链表结构将转化为树形结构(红黑树)

UNTREEIFY_THRESHOLD:
也是指节点数,不过是树形结构转换为链表结构

MIN_TREEIFY_CAPACITY:
是指当桶被转化为树形结构的时候,此时桶所拥有的最小容量

上一篇:Java基础之hashcode剖析


下一篇:JAVA基础学习