在JDK1,.8之前:
HashMap底層采用的是數(shù)組加鏈表也就是鏈表散列的方式來(lái)實(shí)現(xiàn)的产艾。數(shù)組是HashMap的主體,而鏈表是為了解決沖突而存在的随闪。HashMap通過(guò)key的hashcode值阳似,然后再經(jīng)過(guò)hash函數(shù),得到當(dāng)前元素要存放的位置蕴掏。接下來(lái)判斷該位置是否存在元素障般,如果存在元素调鲸,就判斷hash值和key值是否相同,如果相同的話(huà)挽荡,就直接覆蓋藐石。如果不相同,就采用拉鏈法來(lái)解決沖突定拟。
所謂的拉鏈法就是將數(shù)組和鏈表結(jié)合在一起于微。每次有沖突的話(huà),就將元素放到?jīng)_突的鏈表當(dāng)中青自。
JDK1.8之后:
HashMap底層發(fā)生了比較大的變化株依,采用的是紅黑樹(shù)。當(dāng)鏈表的長(zhǎng)度大于閾值(一般設(shè)置為8)延窜,就將鏈表轉(zhuǎn)化成紅黑樹(shù)恋腕,減少搜索的時(shí)間。