Hashmap
存储结构
内部使用Node数组table存储
1 | transient Node<K,V>[] table; |
Node结构存储键值对,next可以看作是指针,所以Node可以看做链表节点,hashmap也使用拉链法来解决冲突,把数组的每个位置当作一个桶,一个桶存一个链表。这个桶中存放key的hash值相同的节点。
1 | static class Node<K,V> implements Map.Entry<K,V> { |
put操作
1 | public class HashMap<K,V> extends AbstractMap<K,V> |
get操作
1 | public V get(Object key) { |
扩容
初始容量16,达到阀值扩容,阀值为最大容量*负载因子,扩容后的容量为原来的2倍,总是为2的n次方
jdk1.7和1.8的resize区别:
1.7中的需要重新用hash和数组长度计算桶下标,而1.8不需要重新计算,只需要看数组长度&hash值以后新增的位是0还是1,如果是0,就还是在原来的索引,如果是1,位置就是
原来的索引+oldCap