HashMap内部有一个Entry数组,可以称之为hash table。HashMap的默认构造值为初始容量为16,负载因子为0.75,阀值(初始容量*负载因子)为12。其默认构造子如下:



































































put方法分析:
<1>HashMap首先判断key是否为null,如果为null,
<1.1>HashMap从hash table中第0个位置的Entry,如果该Entry不等于null且entry.key也不为null,当前value覆盖entry的value。
<1.2>否则,在hash table[0]处创建新的key=null的Entry。
<2>
接下来,以key的hashcode做hash运算,获得hash值。该hash值与hash table的长度-1做与操作,获得key在当前hash table中的位置索引。
然后检查在该索引位置是否存在Entry对象,如果存在,且该Entry对象的key的hash值与上面计算的hash值相等,且entry的key与传入的key相等或者key.equals(entry.key),那么以当前的value值覆盖旧值,并返回旧值。
如果hash table中不存在key所指定的Entry,那么就要增加新的Entry。在增加Entry后,要检查容量是否已经达到阀值,如果达到阀值,就以当前hash table的长度的2倍扩展。同时要重新计算entry在新的hash table中的索引位置。注意,由于hash计算可能导致key的hash值可能是重复的,HashMap采用链表的方式解决hash值冲突的问题,另外一种解决方法是开放地址法。
以下是put方法部分代码:


































处理key为空的情况:






















计算key的hash值与计算key所应处在hash table中的位置:



















增加entry节点以及扩容:










------------------------------------------------























get方法分析:
当调用get方法时,HashMap首先判断key是否为null,如果为null,其hash值为0,否则通过hash算法计算。
接下来,通过该hash值与hash table的长度-1做与操作,获得key在hash table中的索引。如果entry不等null,且该传入key的hash值与entry的hash值相等,且key==entry.key或者key.equals(entry.key),则返回该entry.value.否则返回null.















