**
对于HashMap
的底层数据结构在Java7
和Java8
中的实现是不同的,在Java7
中是采用数组+链表的数据结构进行实现,而在Java8
中是采用数组+链表+红黑树的数据结构实现的。
说时迟那时快,刚话说完,从兜里拿出笔和纸,啪地一声放在桌子上画了起来,许久之后,出现了两幅jdk7和jdk8的HashMap的内部结构图:
上图是jdk7
内部结构图,以Entry<K,V>[]
数组作为哈希桶,每个哈希桶的后面又可以连着一条单向链表,在链表中以k,v
的形式存储数据,并且每一个节点有指向下一节点的指针。
上图是jdk8
的HashMap
的内部结构图,此时在源码源码中就不再使用Entry<K,V>[]
作为数组,而是使用Node<K,V>[]
数组作为哈希桶,每个哈希桶的后面也可能连着一条单向链表或者红黑树。
当单向链表的值>8
的时候,链表就会转换为红黑树进行存储数据,具体详细的红黑树介绍之前已经写过一篇,这里就不再赘述,未详细了解的请移至这一篇[B树、B-树、B+树、B*树图文详解]。
在面试大厂的时候,其实答到这里,还是不完整的,为什么呢?因为你想你说的上面的实际由jdk7
和jdk8
转变的一个结果,但是重要的为什么要这样做?你还没有回答。
如果你聪明点的话,就不会等着面试官抛出接下来的问题?而是自己去回答这个为什么?不是等着面试官继续抛出这个为什么?一个会聊天的人他会去猜测对方想知道什么?