對於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...