JDK原始碼閱讀(三) LinkedHashMap

2021-08-17 19:42:32 字數 1566 閱讀 9356

一、linkedhashmap原理

static class entryextends hashmap.node

}

二、hashmap分析

(1)關鍵的屬性

//表示linkedhashmap的頭節點

transient linkedhashmap.entryhead;

//表示尾節點

transient linkedhashmap.entrytail;

//表示訪問順序,false表示插入順序,true為訪問順序,訪問過的會放在後面

final boolean accessorder;

(2)關鍵的方法

新建立節點,類似的還有newtreenode

/**

* 該方法只有在新建立節點的時候才會被呼叫

* 建立新的節點,將節點插入到hashmap中。

* @param hash

* @param key

* @param value

* @param e

* @return

*/nodenewnode(int hash, k key, v value, nodee)

/*** 建立鍊錶,並與之前的節點建立聯絡

*/private void linknodelast(linkedhashmap.entryp)

}

afternoderemove、afternodeaccess、afternodeinsertion方法,這三個方法是在hashmap中有乙個空的實現,而linkedhashmap對其進行了自己的實現。所以在呼叫完hashmap相關方法後,在出現這三個方法的地方呼叫子類的實現.

/*

* 新增元素呼叫的是hashmap的預設行為

* 但插入元素後會呼叫afternodeaccess,

* accessorder為true才會執行

* 這個函式的作用是將e從鍊錶中拿出來放在末尾

* 之前的位置由其前後節點連線起來

* @param e

*/void afternodeaccess(nodee)

tail = p;

++modcount;}}

/*** 當插入乙個新元素的時候,會刪除頭結點。

* 這個方法預設不會生效,因為removeeldestentry永遠返回false

* 如果使用必須重寫removeeldestentry

* @param evict

*/void afternodeinsertion(boolean evict)

}/**

* 在節點刪除之後呼叫它,節點刪除使用父類hashmap的方法。

* 將之前的節點與當前節點之後的節點建立聯絡

* @param e

*/void afternoderemoval(nodee)

另外還有一些遍歷的方法,這些其實就是鍊錶的遍歷。也沒什麼好說的了。

ps:如有不對,請大佬指出~

JDK 原始碼 閱讀

to be continuing.持續修改中。1.stringbuffer 所處類層次 易忽略點 這個類是執行緒安全的。所有的method直接或間接加synchronized。所以我們如果是單執行緒情況下也考慮到這個會不會影響到效率。當然可能jit可以進行這個優化,待我接下來驗證。預設情況下乙個長為...

《JDK原始碼閱讀三》 ArrayList類

1.預設初始容量是10 當新增第乙個元素時,如果 this.elementdata defaultcapacity empty elementdata 那麼預設初始大小設定為10 2.擴容大小為 1.5倍 關鍵 int newcapacity oldcapacity oldcapacity 1 在a...

jdk原始碼閱讀 linkedlist

首先還是從建構函式開始 constructs an empty list.public linkedlist 是乙個空的 然後我們從add看 public boolean add e e 定位到linklast void linklast e e 觀察發現這個node是乙個雙向鍊錶,每乙個節點指著自...