本文已参与「新人创作礼」活动,一起开启掘金创作之路。
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。这是jdk8之前的实现方式,但是在JDK8后对HashMap进行了底层优化,改为了由数组 +链表+红黑树实现,主要的目的是提高查找效率。
HashMap的主结构类似于一个数组,添加值时通过key确定储存位置.
每个位置是一个Entry的数据结构,该结构可组成链表.当发生冲突时,相同hash值的键值对会组成链表.
这种数组+链表的组合形式大部分情况下都能有不错的性能效果,Java6、7就是这样设计的.
然而,在极端情况下,一组(比如经过精心设计的)键值对都发生了冲突,这时的哈希结构就会退化成一个链表,使HashMap性能急剧下降.
所以在Java8中,HashMap的结构实现变为数组+链表+红黑树
可以看出,HashMap底层就是一个数组结构。
数组中的每一项又是一个链表,当新建一个HashMap时,就会初始化一个数组.
简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。
hash算法是算的key的值,并不是采用Entry计算的,不过保存的时候自然是 key-value 对。