Java面试集-基础-HashMap集合
2019-10-09 本文已影响0人
Hibug
数据结构
JDK1.7 是数组+链表:链表是单向链表,新添加的节点在前面。
JDK1.8 是红黑树。
hashCode
hashCode相同,值不一定相同。
equals相同,值一定相同。
扩容相关
默认长度为16
什么时候开始扩容,size >= 12
例子:
System.out.println("Ma".hashCode());
System.out.println("NB".hashCode());
//hashcode值都等于2484
扩容
image.pnghashmap为什么线程不安全
1. put()方法;
场景:当有a,b,c,d 4个线程同时进入到这个方法操作同一个Key的时候,其中b做的修改,a,c,d做的是读操作,那么有可能读的不是同一个值。
2. resize()方法
场景:当有a,b,c,d 4个线程可能同时触发扩容的操作,各自生成新的数组并rehash后赋给该map底层的数组table,结果最终只有最后一个线程生成的新数组被赋给table变量,其他线程的均会丢失