jdk1.7及以前的实现方式
在jdk1.7及以前,是通过数组
加链表
的数据结构来存储哈希表的。
存在的问题是,当哈希碰撞比较严重,在数组的某一些index上的链表比较长的话,会影响哈希表的查询和更新效率。
我们知道,链表是线性查找的,如果链表有n个元素,那么查询效率为O(n),当n逐渐增大时,链表的查询耗时会线性增长。
jdk1.8中的优化
为了提高查询效率,jdk1.8中使用红黑树(平衡二叉查找树)来替代链表,使得查询效率能够达到O(log2n)。(公式格式显示关系,2为底数)
由于红黑树相对链表会复杂一些,因此在具体的实现时,只有当某一个index上的元素个数超过设定的阈值(默认是8)时才会在该index上启用红黑树结构,否则依旧使用链表。
同时,如果哈希表的数组长度小于设定的阈值时(默认是64),也不会启用红黑树,而是做一次resize操作,期望通过增大数组长度来减缓因哈希碰撞而在某一些index上元素数量过多的问题。
因此,只有当哈希表数组长度大于等于设定的阈值(默认是64),且某一个index上的元素个数超过设定的阈值(默认是8),才会在该index上使用红黑树替代链表。