1、HashMap是什么?
- HashMap继承自Map接口,是键值对存储的一种集合。
- JDK1.7之前底层使用数组+链表实现;JDK1.8之后当链表长度大于默认值8的时候,链表转换为红黑树
- 一般的put()方法就是将key-value添加到HashMap当中,通过key的hashCode经过扰动函数后得到hash值就是在数组中的位置,之后判断数组中是否已经存在了当前的value,存在则覆盖,不存在通过拉链法解决
Map<Object,Obkect> hashmap = new HashMap<>();
hashmap.put(key,value);
2、put()方法具体经历了什么?
-
HashMap首先判断table是否为null或长度为0,是的话则进行扩容,然后根据key计算hashCode(),得到存储key-value对的位置索引。
-
判断索引处是否为空,若为空,则直接插入到对应的数组中,
-
否则,判断key是否已存在,如果已存在则直接覆盖
-
否则,判断里面是链表还是红黑树,
若是红黑树,则插入到红黑树;
若是链表,则遍历链表插入,java8是将元素插入到链表尾部,
-
插入后,判断链表长度,若长度大于等于8,则将链表转为红黑树,
-
最后判断数组的size()是否大于等于门限值,是的话则进行扩容。
3、查看源码
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
bo