static int indexfor(int h, int length)
假設陣列長度分別為15和16,優化後的hash碼分別為8和9,那麼&運算後的結果如下:
h & (table.length-1) hash table.length-1
8 & (15-1): 0100 & 1110 = 0100
9 & (15-1): 0101 & 1110 = 0100
8 & (16-1): 0100 & 1111 = 0100
9 & (16-1): 0101 & 1111 = 0101
從上面的例子中可以看出:當8、9兩個數和(15-1)2=(1110)進行「&運算」的時候,產生了相同的結果,都為0100,也就是說它們會定位到陣列中的同乙個位置上去,這就產生了碰撞,8和9會被放到陣列中的同乙個位置上形成鍊錶,那麼查詢的時候就需要遍歷這個鍊錶,得到8或者9,這樣就降低了查詢的效率。
同時,我們也可以發現,當陣列長度為15的時候,hash值會與(15-1)2=(1110)進行「&運算」,那麼最後一位永遠是0,而0001,0011,0101,1001,1011,0111,1101這幾個位置永遠都不能存放元素了,空間浪費相當大,陣列可以使用的位置比陣列長度小了很多,這意味著進一步增加了碰撞的機率,減慢了查詢的效率!
而當陣列長度為16時,即為2的n次方時,2n-1得到的二進位制數的每個位上的值都為1(這是乙個奇妙的世界),這使得在低位上&時,得到的和原hash的低位相同,加之hash(int h)方法對key的hashcode的進一步優化,加入了高位計算,就使得只有相同的hash值的兩個值才會被放到陣列中的同乙個位置上形成鍊錶。
所以說,當陣列長度為2的n次冪的時候,不同的key算得得index相同的機率較小,那麼資料在陣列上分布就比較均勻,也就是說碰撞的機率小,相對的,查詢的時候就不用遍歷某個位置上的鍊錶,這樣查詢效率也就較高了。
list.isempty() list.size()>0
listlist = new arraylist();
list.add(new random().nextint(10));
list.add(new random().nextint(10));
//開始迭代
iteratoriter = list.iterator();
while (iter.hasnext())
java集合面試題整理
可能會導致死迴圈和更新丟失問題。死迴圈的成因涉及到四個方法,最初的起因是呼叫put 方法,跟著方法走一遍 put 方法原始碼 只給出核心部分 public v put k key,v value modcount 該key不存在,需要增加乙個結點 addentry hash,key,value,i ...
java集合包整理
1.集合包 集合包最常用的有collection和map兩個介面的實現類,colleciton用於存放多個單物件,map用於存放key value形式的鍵值對。collection中最常用的又分為兩種型別的介面 list和set,兩者最明顯的差別為list支援放入重複的元素,而set不支援。list...
Java集合碎片整理 三
接著 二 come on treeset 可以實現去重和排序 public class tree class dog implements comparable public string tostring public int compareto object obj dog dog dog ob...