先来个大方向:
1、HashMap是通过将value存在数组中实现的。
2、然后数组实际上是一个链表数组。(因为,数组的下标实际上是通过key中key.hashCode()的方法计算的,所以可能会重复,这个时候就需要一个链表来解决这个重复)
3、由于是存在数组中 ,这样通过key就可以直接得到对应value,实现了时间复杂度O(1)
现在基于java9.0的源码,解释下下面几个细节:
1、数组的下标是怎么计算的?
这里直接贴两个关键 的源码
a、数组下标计算得到key的hash: (key ==null) ?0 : (h = key.hashCode()) ^ (h >>>16); (为了分布均匀)
b、通过上面获得的hash而获得真正的数组下标:(n -1) & hash (n为数组的长度,其实就是一个取余操作,保证下标在数组内)
2、数组大小改变了怎么办?
改变了 存储位置就会发生变化,需要重新放置。