HashMap和雙向鏈表合二為一即是LinkedHashMap。所謂LinkedHashMap绵估,其落腳點在HashMap炎疆,因此更準確地說,它是一個將所有Entry節(jié)點鏈入一個雙向鏈表的HashMap国裳。由于LinkedHashMap是HashMap的子類形入,所以LinkedHashMap自然會擁有HashMap的所有特性。比如缝左,LinkedHashMap的元素存取過程基本與HashMap基本類似亿遂,只是在細節(jié)實現上稍有不同。當然渺杉,這是由LinkedHashMap本身的特性所決定的蛇数,因為它額外維護了一個雙向鏈表用于保持迭代順序。
不過遺憾的是是越,HashMap是無序的耳舅,也就是說,迭代HashMap所得到的元素順序并不是它們最初放置到HashMap的順序倚评。HashMap的這一缺點往往會造成諸多不便浦徊,因為在有些場景中,我們確需要用到一個可以保持插入順序的Map天梧。慶幸的是盔性,JDK為我們解決了這個問題,它為HashMap提供了一個子類 —— LinkedHashMap呢岗。雖然LinkedHashMap增加了時間和空間上的開銷冕香,但是它通過維護一個額外的雙向鏈表保證了迭代順序。特別地后豫,該迭代順序可以是插入順序悉尾,也可以是訪問順序。因此挫酿,根據鏈表中元素的順序可以將LinkedHashMap分為:保持插入順序的LinkedHashMap 和 保持訪問順序的LinkedHashMap焕襟,其中LinkedHashMap的默認實現是按插入順序排序的。
更直觀地饭豹,下圖很好地還原了LinkedHashMap的原貌:HashMap和雙向鏈表的密切配合和分工合作造就了LinkedHashMap鸵赖。特別需要注意的是,next用于維護HashMap各個桶中的Entry鏈拄衰,before它褪、after用于維護LinkedHashMap的雙向鏈表,雖然它們的作用對象都是Entry翘悉,但是各自分離茫打,是兩碼事兒。
其中妖混,HashMap與LinkedHashMap的Entry結構示意圖如下圖所示: