- Node类
Node类,此类实现Map.Entry接口,此类对Key,Value的封装,同时也是一个单向链表。
-
Node类中包含的属性有:
-
hash:哈希值
-
key:键
-
value:值
-
next:下一个结点的引用
-
属性:
-
size:元素个数
-
loadfactor:加载因子,默认为0.75,(元素个数/数组长度)超过这个值时,将会扩容
-
table:内部用来存储键值对(Node)的数组。
-
构造方法:
-
构造方法的作用就是记录一下16这个数给threshold(这个数值最终会当作第一次数组的长度。),和初始化加载因子。注意,hashMap中table数组一开始就已经是个没有长度的数组了。
-
():初始长度为16,加载因子是0.75;
-
(int ):指定初始长度,建议为2的次方
-
(int,double)指定初始长度和加载因子
-
(map)有初始值:
-
方法:
-
put(key,value)
-
1重新计算hash值
-
2判断是否扩容,并完成扩容
-
3计算存储位置:(table.length-1)&hash==hash%table.length;
-
4.存储新元素需要进行判断:
如果此位置没有元素,直接存到此位置。
如果此位置的key与新key相等,替换
如果不相等,则遍历单向链表
hashMap的重点:
- hashMap存放元素的过程:
通过key,value封装成一个entry对象,然后通过key的值计算entry的hash值,接着通过entry的hash值和数组的长度计算出entry放在数组的那个位置,每次存放都将entry存放在第一个位置。 - loadFactor加载因子为什么是0.75的原因:
loadFactor加载因子是控制数组存放数据的疏密程度,loadFactor越趋近于1,那么数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor越小,也就是趋近于0,那么数组中存放的数据也就越稀,也就是可能数组中每个位置上就放一个元素。那有人说,就把loadFactor变为1最好吗,存的数据很多,但是这样会有一个问题,就是我们在通过key拿到我们的value时,是先通过key的hashcode值,找到对应数组中的位置,如果该位置中有很多元素,则需要通过equals来依次比较链表中的元素,拿到我们的value值,这样花费的性能就很高,如果能让数组上的每个位置尽量只有一个元素最好,我们就能直接得到value值了,所以有人又会说,那把loadFactor变得很小不就好了,但是如果变得太小,在数组中的位置就会太稀,也就是分散的太开,浪费很多空间,这样也不好,所以在hashMap中loadFactor的初始值就是0.75,一般情况下不需要更改它。
3.桶的概念:
数组中每一个位置上都放有一个桶,每个桶里就是装一个链表,链表中可以有很多个元素(entry),这就是桶的意思。也就相当于把元素都放在桶中。
4.capacity
这个就代表的数组的容量,也就是数组的长度,同时也是HashMap中桶的个数。默认值是16.