HashMap-实现原理
HashMap的数据结构:底层使用hash表数据结构、链表、红黑树的组合
- 当我们往hashMap中put元素时,利用key的hashcode去进行hash函数计算得到hash值就可以计算出,当前对象的元素在数组中的下标了。
- 存储时,有两种情况:
- 如果key相同,则覆盖
- 如果不相同,说明产生hash冲突了,将当前key-value放入链表或红黑树中。
- 链表的长度大于8,且数组长度大于64,链表才会转为红黑树
- 获取时,直接找打hash值对应的下标,进一步判断key是否相同,从而找到对应的值
HashMap-JDK7和JDK8有什么区别
- JDK8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,每个数组中的元素就是一个链表。若遇到哈希冲突,则将冲突值加到链表中即可。
- JDK8之后在解决哈希冲突时有了变化,当链表长度大于阈值(8)时,并且数组长度达到64时,将链表转为红黑树,以减少搜索时间。在扩容时,红黑树拆分成的树的结点小于等于临界值6个,则退化为链表。