HashMap中如何計算陣列索引下標?

2021-10-10 22:55:08 字數 2242 閱讀 1636

對於key的hashcode做hash操作,無符號右移16位然後做異或運算。

還有平方取中法,偽隨機數法和取餘數法。這三種效率都比較低。而無符號右移16位異或運算效率是最高的。

集合中的初始化容量(必須是二的n次冪)

//預設的初始容量是16 -- 1<<4相當於1*2的4次方---1*16

static

final

int default_initial_capacity =

1<<

4;

舉例分析:

說明:按位與運算:相同的二進位制數字上,都是1的時候,結果為1,否則為零。

例如長度為8時候,3&(8-1)=3 2&(8-1)=2 ,不同位置上,不碰撞;

例如長度length為8時候,8是2的3次冪。二進位制是:1000

length-

1 二進位制運算:

1000-1

----

----

----

----

----

-111

如下所示:

hash&

(length-1)

3&(8

-1)=

300000011

3 hash

&00000111

7 length-1--

----

----

----

-------

00000011

----

-》3 陣列下標

hash&

(length-1)

2&(8

-1)=

200000010

2 hash

&00000111

7 length-1--

----

----

----

-------

00000010

----

-》2 陣列下標

說明:上述計算結果是不同位置上,不碰撞;

例如長度為9時候,3&(9-1)=0 2&(9-1)=0 ,都在0上,碰撞了;

例如長度為9時候,3&(

9-1)

=02&

(9-1

)=0 ,都在0上,碰撞了;

例如長度length為9時候,9不是2的n次冪。二進位制是:00001001

length-

1 二進位制運算:

1001-1

----

----

----

----

----

-1000

如下所示:

hash&

(length-1)

3&(9

-1)=

000000011

3 hash

&00001000

8 length-1--

----

----

----

-------

00000000

----

-》0 陣列下標

hash&

(length-1)

2&(9

-1)=

200000010

2 hash

&00001000

8 length-1--

----

----

----

-------

00000000

----

-》0 陣列下標

說明:上述計算結果都在0上,碰撞了;

總結:

1.由上面可以看出,當我們根據key的hash確定其在陣列的位置時,如果n為2的冪次方,可以保證資料的均勻插入,如果n不是2的冪次方,可能陣列的一些位置永遠不會插入資料,浪費陣列的空間,加大hash衝突。

2.另一方面,一般我們可能會想通過 % 求餘來確定位置,這樣也可以,只不過效能不如 & 運算。而且當n是2的冪次方時:hash & (length - 1) == hash % length

3.因此,hashmap 容量為2次冪的原因,就是為了資料的的均勻分布,減少hash衝突,畢竟hash衝突越大,代表陣列中乙個鏈的長度越大,這樣的話會降低hashmap的效能

4.如果建立hashmap物件時,輸入的陣列長度是10,不是2的冪,hashmap通過一通位移運算和或運算得到的肯定是2的冪次數,並且是離那個數最近的數字。

階乘計算 陣列

問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相...

js 如何快速計算陣列數量總和

在工作中會經常有計算數量總和的功能,在以前實現這個功能的時候,會遍歷陣列裡面的數量,一遍一遍的迴圈計算,例如,想要快速計算陣列 1,2,3,4,5 以前會這樣寫 var numarray 1 2,3 4,5 var sum 0 for var i 0 i numarray.length i cons...

C語言如何計算陣列的長度

原創i.czy 1 借助sizeof 函式 include int main int length 0 計算陣列中資料長度 所有資料的位元組數除以乙個資料的位元組數即為資料的個數 length sizeof arr sizeof int printf 陣列的長度為 d n length return...