日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

linkhashmap原理_LinkedHashMap原理

發布時間:2023/12/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linkhashmap原理_LinkedHashMap原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LinkedHashMap和HashMap經常會一同問到,不過看了LinkedHashMap內部的源碼相對比較簡單,如果事先看過HashMap的源碼的話。

概覽

首先可以看到LinkedHashMap是繼承HashMap的,所有HashMap能干的事,LinkedHashMap也能干。

然后多個幾個屬性,解釋如下

public class LinkedHashMap

extends HashMap

implements Map{

/**

HashMap的節點增加before和after字段

*/

static class Entry extends HashMap.Node {

Entry before, after;

Entry(int hash, K key, V value, Node next) {

super(hash, key, value, next);

}

}

/**

* 雙向鏈表的頭結點

*/

transient LinkedHashMap.Entry head;

/**

* 雙向鏈表的尾節點

*/

transient LinkedHashMap.Entry tail;

/**

* 雙向鏈表的訪問順序,true的話房屋有序,false時插入有序。

*/

final boolean accessOrder;

...

}

從上面大概可以看出來LinkedHashMap是一個雙向鏈表加Map。在HashMap基礎上多個頭指針,尾指針,然后節點相互連接

image.png

get操作

看源碼

public V get(Object key) {

Node e;

//如果未獲取到元素,返回null

if ((e = getNode(hash(key), key)) == null)

return null;

//如果獲取到了元素,判斷accessOrder,如果為true代表按訪問排序。

if (accessOrder)

afterNodeAccess(e);

return e.value;

}

//把參數中的節點移動至鏈表的尾節點

void afterNodeAccess(Node e) {

LinkedHashMap.Entry last;

//last節點為尾節點

if (accessOrder && (last = tail) != e) {

//先得到e節點的前節點,后節點,與自身節點,

// 加上尾節點有四個節點了

LinkedHashMap.Entry p =

(LinkedHashMap.Entry)e, b = p.before, a = p.after;

//這幾個主要操作就是把節點移動至尾巴節點。

p.after = null;

if (b == null)

head = a;

else

b.after = a;

if (a != null)

a.before = b;

else

last = b;

if (last == null)

head = p;

else {

p.before = last;

last.after = p;

}

tail = p;

++modCount;

}

}

畫的比較丑,但是鏈表的刪除操作,大家懂的,O(1),改變一下前后節點的指針即可。

image.png

put操作

put操作,采用的仍然為HashMap原本的操作,不過擴展了節點插入之后操作的方法

put節點的時候,新的節點會維持一個鏈表。

//覆蓋了原本的newNode方法,沒一個新的節點都做一次鏈表的操作

Node newNode(int hash, K key, V value, Node e) {

LinkedHashMap.Entry p =

new LinkedHashMap.Entry(hash, key, value, e);

linkNodeLast(p);

return p;

}

// 把節點放到最后面

private void linkNodeLast(LinkedHashMap.Entry p) {

LinkedHashMap.Entry last = tail;

tail = p;

if (last == null)

head = p;

else {

p.before = last;

last.after = p;

}

}

//HashMap方法

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,

boolean evict) {

Node[] tab; Node p; int n, i;

if ((tab = table) == null || (n = tab.length) == 0)

n = (tab = resize()).length;

if ((p = tab[i = (n - 1) & hash]) == null)

tab[i] = newNode(hash, key, value, null);

else {

Node e; K k;

if (p.hash == hash &&

((k = p.key) == key || (key != null && key.equals(k))))

e = p;

else if (p instanceof TreeNode)

e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);

else {

for (int binCount = 0; ; ++binCount) {

if ((e = p.next) == null) {

p.next = newNode(hash, key, value, null);

if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st

treeifyBin(tab, hash);

break;

}

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;

}

}

if (e != null) { // existing mapping for key

V oldValue = e.value;

if (!onlyIfAbsent || oldValue == null)

e.value = value;

afterNodeAccess(e);

return oldValue;

}

}

++modCount;

if (++size > threshold)

resize();

afterNodeInsertion(evict);

return null;

}

//重寫remoeEldestEntry可實現LRU算法

void afterNodeInsertion(boolean evict) { // possibly remove eldest

LinkedHashMap.Entry first;

if (evict && (first = head) != null && removeEldestEntry(first)) {

K key = first.key;

removeNode(hash(key), key, null, false, true);

}

}

resize方法

resize與HashMap沒有變化,這里溫故一下, 參考之前HashMap的resieze

擴容兩倍之后,會重新計算Hash。

假設原本容量為:

16 = 0x10000 ,那么16以下的數與16進行hash都得0. 16以上的數&16為正數

擴容之后,容量變為32,需要重新分配位置的為大于原本16的數,然后加上新的擴容量計算得新的位置。

32 = 0x100000

最后

Java基礎中的集合類,有必要掌握

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的linkhashmap原理_LinkedHashMap原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久天 | 国产乱码精品一区二区三区精东 | 毛茸茸日本熟妇高潮 | 日日夜夜超碰 | 尤物在线观看 | 91成人免费电影 | 进去里片欧美 | 午夜免费福利在线 | 久久九九爱| 天天爽夜夜爽视频 | 亚洲淫视频 | 国产一区二区三区免费 | 又黄又爽的网站 | 国产欧美精品在线 | 日韩在线影视 | 一本高清dvd在线播放 | 久久久久久国产视频 | 日本成人三级 | 极品五月天 | 亚洲制服无码 | 黄色免费网站 | 河北彩花av在线播放 | 中文字幕亚洲成人 | 欧美激情国产一区 | 久久久永久久久人妻精品麻豆 | 亚洲色图视频在线观看 | 在线黄色网页 | 色噜噜色狠狠 | 天堂av在线中文 | 亚州av在线播放 | 黄色xxxxx | 人与嘼交av免费 | 日日精品| 青青草97国产精品免费观看 | 老司机午夜在线 | 夜夜嗨av一区二区三区免费区 | www九九热| 国产精品爽爽爽 | 少妇喷白浆 | 国产乱xxⅹxx国语对白 | 男人添女人下部高潮全视频 | 成人av在线一区二区 | 青青色在线观看 | 加勒比精品在线 | 禁断介护老人中文字幕 | 无码人妻aⅴ一区二区三区有奶水 | 性欧美13一14内谢 | 成人免费观看网站 | 天天操狠狠操 | 乱视频在线观看 | 亚洲欧美日韩精品永久在线 | 欧美性受xxxx黑人猛交88 | 麻豆久久久久久久 | 俺也去综合 | 亚洲xx网站 | 精品一区二区在线播放 | 五月网站| 在线观看国产视频 | 免费涩涩 | 日日舔夜夜操 | 一亲二脱三插 | 国产精品成人无码专区 | 国产成人无码一区二区在线观看 | 性猛交ⅹxxx富婆video | 高潮疯狂过瘾粗话对白 | 熟女少妇内射日韩亚洲 | 国产精品国产三级国产传播 | 免费久久久 | 午夜网站在线 | 五月天精品视频 | 伊人青青久久 | 精品国产九九九 | 国产一区二区在线免费观看 | 黄色片网站免费 | 国产精品一区二区免费在线观看 | 狠狠插综合 | 亚洲男人皇宫 | 国产做受视频 | 日韩欧美国产一区二区 | 欧产日产国产精品98 | 国产区免费 | 精品探花 | 一边摸一边做爽的视频17国产 | 久久久久99人妻一区二区三区 | www.69视频 | 精品无码国产一区二区三区51安 | 精品人妻一区二区乱码 | 疯狂做爰的爽文多肉小说王爷 | 成人性生活免费看 | 乱短篇艳辣500篇h文最新章节 | 亚洲乱亚洲乱 | 老色批影院 | 中文字幕乱码中文乱码777 | 美女隐私无遮挡网站 | 四虎在线免费 | 狠狠躁日日躁 | 成人午夜电影网站 | 极品在线观看 | 亚洲暴爽 |