说实话,这个以前专门查过,不过过了一段时间又忘了。。。前几天在刚好看到有人问HashMap的问题,感觉可以答,但只记得8有个红黑树,唉,好记性不如烂笔头,写个blog记录下,虽然这个问题很无聊 o(╯□╰)o
首先说一下jdk7中HashMap 存储的方式: 数组加链表 数组用来存放key的哈希值,链表用来存放Entry 值。当key的hashCode 冲突且新 key不存在时,使用”头插法”将这个新Entry放到链表的头部,将其next 指向先前的Entry。
大概就像这样:
所以说,在最差的情况下,即所有key的hashCode都一样,那么hashmap 就会退化成一个链表,查找的时间复杂度为O(n);当然理想情况下查找的时间复杂度是O(1);在jdk8中,在到达某个阈值时,会使用红黑树来提高效率。红黑树的查找、插入、删除的时间复杂度是O(logN)。
那么可以这样说,jdk7是 数组+链表,jdk8是数组+链表/红黑树 。
在源码中可以看到,当链表长度长度大于等于7时,会执行链表转换红黑树操作
。所以结构就变成了这个样子:
红黑树的知识点,后面再写blog,不然又会忘掉 。orz