一、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是乙個雙向鍊錶,每乙個節點指著自...