java中 HashMap的简单原理

先来个大方向:

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、数组大小改变了怎么办?

改变了 存储位置就会发生变化,需要重新放置。

你可能感兴趣的:(java中 HashMap的简单原理)