首先,在解决这个问题之前我们要先了解hash冲突是什么.
hash冲突
hashmap在添加新的键值对的时候,会根据key值通过一个函数计算出一个结果作为地址值,根据这个地址值将其键值对插入到对应的位置,但是不同的键值对在插入时,根据key计算出来的结果地址值可能是相同的,这个时候,对应的位置已经存在了数据,而正是因为这样插入时产生了冲突,也就是所谓的hash冲突.
解决冲突
HashMap在jdk中使用了拉链法来解决hash冲突的问题
拉链法就是:在插入数据时,发生了哈希冲突,我们将已经在对应位置的那个数据单独拉出来一个单向链表的数据结构,将我们新插入的键值对放到链表的下一个节点中.
jdk7及之前
在jdk1.7及之前中,我们使用的是单纯的单向链表插入,但是我们都知道当链表长度较长的时候,我们查询起来数据就会变得很慢,严重影响了性能.
jdk8之后
所以在jdk8之后,采用了链表+红黑树的数据结构.
但是,也只有在链表长度大于8的时候,hashmap才会将后面的数据存在红黑树中,以加快检索速度.
而且红黑树的特性让它拥有较高的查询性能的同时,避免维持平衡带来的很大开销。