Java面试集-基础-HashMap集合

数据结构

JDK1.7 是数组+链表:链表是单向链表,新添加的节点在前面。

JDK1.8 是红黑树。

hashCode

hashCode相同,值不一定相同。
equals相同,值一定相同。

扩容相关

默认长度为16
什么时候开始扩容,size >= 12

例子:

System.out.println("Ma".hashCode());
System.out.println("NB".hashCode());
//hashcode值都等于2484

扩容

image.png

hashmap为什么线程不安全

1. put()方法;

场景:当有a,b,c,d 4个线程同时进入到这个方法操作同一个Key的时候,其中b做的修改,a,c,d做的是读操作,那么有可能读的不是同一个值。

2. resize()方法

场景:当有a,b,c,d 4个线程可能同时触发扩容的操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失

你可能感兴趣的:(Java面试集-基础-HashMap集合)