1、HashMap 數組下標計算方式:
(h 是k的hashcode值;length是數組長度,HashMap數組默認長度是16)
2、&是什么意思?
&在 java 中做與運算,& 是所有的2進制位數“與”出的最終結果,“與”的規則是兩者都為1時才得1,否則就得0
例如
132&15 = ?
答案:4
why?
阿拉伯數字(十進制):132 二進制:10000100
阿拉伯數字(十進制):15 二進制:0000 1111(計算器轉換應該是1111,因為兩個二進制進行運算時,需要在位數少的前面補零-補碼操作)
10000100 & 0000 1111 = 0100
(0100 & 1111 = 0100 )真正的運算是這樣的,根據&的規則則取末尾是0的0100
根據上述的例子差不多能明白點了吧,如果還有疑惑點接着往下看
public class HashTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(128&129); //128:10000000 129:10000001 ##結果:128(10000000)
System.out.println(128&15); //15:0000 1111 128:10000000 ##結果:0(0000)
System.out.println(129&15); //15:0000 1111 129:10000001 ##結果:1(0001)
System.out.println(134&15); //15:0000 1111 134:10000110 ##結果:6(0110)
System.out.println(134&14); //14:0000 1110 134:10000110 ##結果:6(0110)
System.out.println(133&15); //15:0000 1111 133:10000101 ##結果:5(0101)
System.out.println(132&15); //15:0000 1111 132:10000100 ##結果:4(0110)
System.out.println(132%16); //結果:4
}
}
①、當兩個數末尾是1和0時,根據規則取0的數
②、當兩個數末尾都是1時,根據規則取數小的,例如1111和0101就是0101
③、132&15和132%16值是一樣的,其實就是兩個公式的表達h&(length-1)和 h%length,面試的時候我覺得說哪一種都沒有什么問題。
注意 :jdk升級到1.8之后,hashmap擴容之后,存儲的數據鍵值在重新hash時,它的位置要么時和原來重復,要門就是原來的hash位置+擴容的大小(例如:原來的hash桶時16,a存放的位置時2,那么在擴容之后,hash桶變成 了32,那么a存放的位置可能時2也有可能時18)
結語:整篇文章完全是自己幾個小時淺薄的理解記錄僅供讀者參考,作者自己也不能確定說的就是正確的,只是自己實驗的總結,歡迎讀者評論區討論
————————————————
版權聲明:本文為CSDN博主「股狼」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq394829044/article/details/103427595