HashMap的实现原理
HashMap的数据结构
在看Hashmap的数据结构之前先来看看数组和链表的特点
数组:寻址容易插入和删除的时候比较困难(数组有下表寻址,但是插入删除的时候下表要移动,扩容的时候也很麻烦)
链表:寻址困难,插入和删除容易,元素的指针指向下一个元素,在插入删除的时候只需要对指针进行操作就好
然而HashMap就是二者的结合,我们可以发现哈希表是由数组+链表组成的如下图
在这里插入图片描述
JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。
JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。如下图(画的不好看,只是表达一个意思。):
在这里插入图片描述
1,进行键值对存储时,先通过hashCode()计算出键key的哈希值