圖解LinkedHashMap

 

LinkedHashMap,總的來說,LinkedHashMap底層是使用HashMap+LinkedList實現的。用HashMap維護數據,用LinkedList來維護數據插入的順序。

 

一、特點總結:

1、LinkedHashMap的結構是數組+鏈表(+紅黑樹)+雙向鏈表。雙向鏈表是用來維護元素的順序的。HashMap的元素是無序的,LinkedHashMap的元素是有序的。LinkedHashMap的存取數據的方式還是跟HashMap一致。

2、和HashMap的不同之處有:遍歷方式不一樣(擴容是用到遍歷),HashMap根據按數組順序來遍歷,如果遇到鏈表,則依次遍歷鏈表中的元素,完了之後繼續遍歷數組的元素。而LinkedHashMap是按雙向列表來遍歷的,所以LinkedHashMap遍歷的性能比HashMap高一點,因爲HashMap中有空元素。

3、LinkedHashMap中雙向鏈表的順序是按元素添加的順序的,新添加的元素被加到雙向鏈表的末尾。LinkedHashMap還有一個accessOrder屬性,可以在new LinkedHashMap的時候傳進去,accessOrder默認爲false,表示訪問元素不改變雙向鏈表中元素的順序,如果accessOrder爲true,則訪問元素的時候,即get一個元素的時候,會把該元素移動(先刪除後添加,修改before和after指向)到雙向鏈表的末尾。

4、LinkedHashMap和HashMap都是線程不安全的。

 

二、使用場景:

可以使用LinkedHashMap來實現FIFO和LRU緩存算法。

FIFO緩存算法:如果鏈表有長度限制的話,最新添加的元素在鏈表頭,最舊的元素在鏈表尾,最舊的元素被首先刪除。

LRU緩存算法:最近最少使用(被刪)。如果鏈表有長度限制的話,最新添加的元素在鏈表的頭部,如果一個元素被訪問了,那麼這個元素會被移動到鏈表頭部,鏈表尾部的元素(最近最少被添加或訪問)首先被刪除。

如果accessOrder設置爲false就是FIFO算法。

如果accessOrder設置爲true就是LRU算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章