數(shù)據(jù)結(jié)構(gòu)
JDK1.7 是數(shù)組+鏈表:鏈表是單向鏈表,新添加的節(jié)點(diǎn)在前面。
JDK1.8 是紅黑樹。
hashCode
hashCode相同,值不一定相同。
equals相同,值一定相同。
擴(kuò)容相關(guān)
默認(rèn)長度為16
什么時候開始擴(kuò)容,size >= 12
例子:
System.out.println("Ma".hashCode());
System.out.println("NB".hashCode());
//hashcode值都等于2484
擴(kuò)容

image.png
hashmap為什么線程不安全
1. put()方法;
場景:當(dāng)有a,b,c,d 4個線程同時進(jìn)入到這個方法操作同一個Key的時候,其中b做的修改,a,c,d做的是讀操作,那么有可能讀的不是同一個值。
2. resize()方法
場景:當(dāng)有a,b,c,d 4個線程可能同時觸發(fā)擴(kuò)容的操作,各自生成新的數(shù)組并rehash后賦給該map底層的數(shù)組table,結(jié)果最終只有最后一個線程生成的新數(shù)組被賦給table變量,其他線程的均會丟失