今天看HashMap的底層實現,發現HashMap的最大容量規定為:
// 最大容量(必須是2的冪且小於2的30次方,傳入容量過大將被這個值替換)
static final int MAXIMUM_CAPACITY = 1 << 30;
當看到 1<<30 時,對“<<” 有點模糊,當了解“<<”的用法之后,又有一個問題;
int類型不是4個字節共32位嗎,為什么不是 1<<31呢?
首先介紹下等號右邊數字及字符的含義:
1、"<<"為左移運算符,1表示十進制中的“1”,30表示十進制數字1轉化為二進制后向左移動30位。在數值上等同於2的30次冪。
2、為什么是2的30次冪?
以一個字節為例:1<<2 = 4
0000 0001(十進制1)
向左移動兩位之后變成
0000 0100(十進制4)
可見 1<<30 等同於十進制中2的30次冪。
回到題目,為什么會是2的30次冪,而不是2的31次冪呢?
首先:JAVA規定了該static final 類型的靜態變量為int類型,至於為什么不是byte、long等類型,原因是由於考慮到HashMap的性能問題而作的折中處理!
由於int類型限制了該變量的長度為4個字節共32個二進制位,按理說可以向左移動31位即2的31次冪。但是事實上由於二進制數字中最高的一位也就是最左邊的一位是符號位,用來表示正負之分(0為正,1為負),所以只能向左移動30位,而不能移動到處在最高位的符號位!
————————————————
版權聲明:本文為CSDN博主「愛碼僧」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33666602/java/article/details/80139620