JDK LinkedHashMap原始碼解析

2021-08-31 04:28:12 字數 1444 閱讀 1855

今天來分析一下jdk  linkedhashmap的源**

public class linkedhashmapextends hashmapimplements map
可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大多數方法

,包括構造方法也呼叫了父類hashmap的構造方法:

public linkedhashmap(int initialcapacity, float loadfactor) 

public linkedhashmap(int initialcapacity)

public linkedhashmap()

public linkedhashmap(map<? extends k, ? extends v> m)

public linkedhashmap(int initialcapacity,

float loadfactor,

boolean accessorder)

但是昨天在分析hashmap的時候說過hashmap的init方法沒有實現,但是linkedhaqshmap已經對其實現:

void init()
在linkedhashmap中多了乙個accessorder變數,他表示迭代時候的乙個順序,若為true,則按照讀取順序排序(讀得越多越在前,也就最先被迭代),若為false

則按照插入順序排序.從linkedhaqshmap的前4個構造方法可以看出,accessorder預設為false,故按照插入順序進行排序.

public v get(object key)
在這個get方法中要注意recordaccess這個方法:

void recordaccess(hashmapm) 

}

這個方法定義在linkedhashmap的內部類entry中,他判斷accessorder屬性,若為true,則執行乙個叫做lru的演算法

該演算法的中文名稱叫做最近最少使用演算法,他通過將剛訪問的entry移除,然後加到header前面,這樣迭代的時候會優先迭代

最近頻繁訪問的entry,從而就改變了迭代的順序

對於put方法,linkedhashmap也實現了父類hashmap沒有實現的recordaccess,並重寫了addentry方法,雖然在linkedhashmap沒有重寫put方法

void addentry(int hash, k key, v value, int bucketindex)  else 

}

可以看到該方法會刪除最老的乙個元素,removeeldestentry是乙個受保護的方法,用來確定是否滿足刪除條件,可以重寫它實現自己的策略,預設該方法返回false

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

Redux原始碼createStore解讀常用方法

const store createstore reducer,preloadedstate enhancer 直接返回當前currentstate,獲取state值,return state 我覺得應該深轉殖乙個新的物件返回,不然有可能會被外部修改 function getstate consol...

JDk原始碼解析之四 Vector原始碼解析

具體的三個屬性 解釋看圖中注釋。vector沒有採取arraylist臨界值擴容的辦法,而是每次不夠的時候,直接根據capacity的值來增加。具體怎麼增加後面會說。vector的構造方法如下。簡單粗暴,如果呼叫無參建構函式,直接就將初始容量設定成了10,最終在右側的構造方法裡,將陣列的長度設定為1...