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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

element 往node里面增加属性值_HashMap加载因子为何0.75,为何初始化值2的指数幂,底层解析...

發(fā)布時(shí)間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 element 往node里面增加属性值_HashMap加载因子为何0.75,为何初始化值2的指数幂,底层解析... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

01

前言

我們在聲名HashMap的時(shí)候,一般都會(huì)這樣寫。

public class MapTest {

public static void main(String[] args) {

HashMapmap=new HashMap<>();

}

}

我們不會(huì)向里面加入初始容量,它自己會(huì)給我們一個(gè)初始化的容量,一般是16。

大家有沒有看過hashmap的底層,java7版本是數(shù)組加鏈表

1.8之后引入紅黑樹。性能提升百分之十到到百分之15左右。

02

加載因子為何0.75

HashMap有兩個(gè)參數(shù)影響其性能:初始容量和加載因子。容量是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時(shí)的容量。加載因子是哈希表在其容量自動(dòng)擴(kuò)容之前可以達(dá)到多滿的一種度量。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對(duì)該哈希表進(jìn)行擴(kuò)容、rehash操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),擴(kuò)容后的哈希表將具有兩倍的原容量。

通常,加載因子需要在時(shí)間和空間成本上尋求一種折衷。

加載因子過高,例如為1,雖然減少了空間開銷,提高了空間利用率,但同時(shí)也增加了查詢時(shí)間成本;

加載因子過低,例如0.5,雖然可以減少查詢時(shí)間成本,但是空間利用率很低,同時(shí)提高了rehash操作的次數(shù)。

在設(shè)置初始容量時(shí)應(yīng)該考慮到映射中所需的條目數(shù)及其加載因子,以便最大限度地減少rehash操作次數(shù),所以,一般在使用HashMap時(shí)建議根據(jù)預(yù)估值設(shè)置初始容量,減少擴(kuò)容操作。

選擇0.75作為默認(rèn)的加載因子,完全是時(shí)間和空間成本上尋求的一種折衷選擇。

03

為何初始化值2的指數(shù)冪

1.奇數(shù)不行的解釋很能被接受,在計(jì)算hash的時(shí)候,確定落在數(shù)組的位置的時(shí)候,計(jì)算方法是(n - 1) & hash ,奇數(shù)n-1為偶數(shù),偶數(shù)2進(jìn)制的結(jié)尾都是0,經(jīng)過&運(yùn)算末尾都是0,會(huì)

增加hash沖突

2.為啥要是2的冪,不能是2的倍數(shù)么,比如6,10?

2.1 hashmap 結(jié)構(gòu)是數(shù)組,每個(gè)數(shù)組里面的結(jié)構(gòu)是node(鏈表或紅黑樹),正常情況下,如果你想放數(shù)據(jù)到不同的位置,肯定會(huì)想到取余數(shù)確定放在那個(gè)數(shù)據(jù)里, ?計(jì)算公式:

hash % n,這個(gè)是十進(jìn)制計(jì)算。在計(jì)算機(jī)中, ?(n - 1) & hash,當(dāng)n為2次冪時(shí),會(huì)滿足一個(gè)公式:(n - 1) & hash = hash % n,計(jì)算更加高效。

2.2 只有是2的冪數(shù)的數(shù)字經(jīng)過n-1之后,二進(jìn)制肯定是 ?...11111111 ?這樣的格式,這種格式計(jì)算的位置的時(shí)候,完全是由產(chǎn)生的hash值類決定,而不受n-1 影響。你可能會(huì)想,

受影響不是更好么,又計(jì)算了一下 ,hash沖突可能更低了,這里要考慮到擴(kuò)容了,2的冪次方*2,在二進(jìn)制中比如4和8,代表2的2次方和3次方,他們的2進(jìn)制結(jié)構(gòu)相 似,比如

4和8 ? 00000100 ? ?0000 1000 ? 只是高位向前移了一位,這樣擴(kuò)容的時(shí)候,只需要判斷高位hash,移動(dòng)到之前位置的倍數(shù)就可以了,免去了重新計(jì)算位置的運(yùn)算。

04

紅黑樹定義

通過源碼解析,我們已經(jīng)很清楚HashMap是在“當(dāng)鏈表已經(jīng)有8個(gè)節(jié)點(diǎn)了,此時(shí)再新鏈上第9個(gè)節(jié)點(diǎn),在成功添加了這個(gè)新節(jié)點(diǎn)之后,立馬做鏈表轉(zhuǎn)紅黑樹

定義:紅黑樹是一種自平衡的二叉查找樹,是一種高效的查找樹。紅黑樹有良好的效率,它可以在時(shí)間復(fù)雜度為O(logN)時(shí)間內(nèi)完成查找 增加 刪除等操作。

性質(zhì):

1.根是黑色

2.節(jié)點(diǎn)是紅色或者黑色

3.所有的葉子都是黑色的(葉子是NIL節(jié)點(diǎn))

4. 每個(gè)紅色節(jié)點(diǎn)必須有兩個(gè)黑色的子節(jié)點(diǎn)

5. 從任一節(jié)點(diǎn)到其每個(gè)葉子的所有簡單路徑都包含相同數(shù)目的黑色節(jié)點(diǎn)。

05

二叉樹查找

public class BST, Value> {

private Node root;

class Node {

Key key;

Value value;

Node left, right;//左右子結(jié)點(diǎn)

int N;//以該結(jié)點(diǎn)為父結(jié)點(diǎn)的所有子結(jié)點(diǎn)的數(shù)量

public Node(Key key, Value value, int N) {

this.key = key;

this.value = value;

this.N = N;

}

}

public void put(Key key, Value value) {

root=put(root,key,value);

}

/**

* 先遞歸向下尋找key所在的位置,如果有則更新對(duì)應(yīng)的value,

* 如果沒有,當(dāng)在樹的底部添加了一個(gè)新結(jié)點(diǎn)之后,還需要

* 從下往上更新所有父結(jié)點(diǎn)的N的值。

*/

private Node put(Node node, Key key, Value value) {

if (node==null){

return new Node(key,value,1);

}

int cmp=key.compareTo(node.key);

if (cmp<0) {

node.left=put(node.left,key,value);

}else if (cmp>0){

node.right= put(node.right,key,value);

}else {

node.value=value;

}

node.N=size(node.left)+size(node.right)+1;

return node;

}

public Value get(Key key) {

return get(root, key);

}

/**

* 使用遞歸的方式,從根節(jié)出發(fā),不斷向下查找

*/

private Value get(Node node, Key key) {

if (node == null) {

return null;

}

int cmp = key.compareTo(node.key);

if (cmp < 0) {

return get(node.left, key);

} else if (cmp > 0) {

return get(node.right, key);

} else {

return node.value;

}

}

public int size() {

return size(root);

}

public int size(Node node) {

if (node == null) return 0;

return node.N;

}

}

總結(jié)

以上是生活随笔為你收集整理的element 往node里面增加属性值_HashMap加载因子为何0.75,为何初始化值2的指数幂,底层解析...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。