记录HashMap的一些知识点
概念:HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null值,key不允许重复。HashMap是线程不安全的。
容量:HashMap默认初始容量为16,负载因子默认为0.75,即达到容量的0.75就进行扩容,每次扩容一倍。即16扩容到32。如果指定容量进行初始化,会通过位运算将容量置为16*2^(n/16)。即指定20实际容量为32,指定40实际容量为64。
临界点:由于HashMap是基于数据+链表+红黑树实现的,所以,存在树转为链表和链表转换为树的临界点。链表转为树的临界点节点个数>=8并且Map的容量>=64.,树转为链表的临界点为树节点<=6。
HashMap中的扩容:JDK1.8是在先put后扩容,JDK1.7的先扩容后put。
put方法原理:
计算key的hash值,找到hash位置的table[i],如果table[i]为null,就新建一个node放在table[i]的位置。如果table[i]不为null,则通过key的hash值与 equals()判断是否有node存在,存在则覆盖,不存在则放在链表末尾。如果node节点个数大于7则进行树化。树化的方法里面有个条件判断HashMap容量已达到最小树化节点容量64这个临界值。即达到node节点大于等于8并且容量大于等于64才进行树化操作。
get方法原理:
计算key的hash值,找到hash位置的table[i],先判断头节点node的key是否与当前传入的key相等,如果相等则返回头节点的value,不相等则继续遍历下一个节点,如果下一个节点为树节点,则遍历树,否则递归遍历链表。
探索不以困难而止,学习不以艰苦而终