hashmap

发布时间 2023-09-13 14:26:28作者: lov_ui

1.hashmap的容量为什么是2的n次方?

位与运算比取模运算快,位于运算基于2的n次方进行运算的。

 

2.hashmap为什么线程不安全

循环列表的同时不允许修改元素

jdk1.7操作hashmap会出现链表死循环

 

3.hashmap的put操作

根据key的hashcode进行位与运算计算数组下标

jdk1.7中 判断是否需要扩容(将当前容量变为原来的两倍,转移元素)  循环列表查找是否有相同的key,有则覆盖,没有则放入链表头部。

jdk1.8中  循环列表查找是否有相同的key, 

如果是红黑树结构,查找树中是否有相同的key,有则覆盖,没有则放入红黑树中

如果数组位置的数据结构是链表,循环链表查找是否有相同的key,有则覆盖,没有则放入链表尾部,如果链表的元素个数超过8个,将链表转换成红黑树,最后再判断是否需要扩容。

4.什么时候会扩容?

put的时候会判断链表位置如果不为空,并且当前的容量超过阈值(当前容量 * 加载因子)