Java8 HashMap之tableSizeFor

  Java8對許多內置的容器進行了優化與拓展,其中對HashMap的改變尤爲大。以後將進行總結。算法

  最近在看HashMap的源碼時,發現了裏面好多很不錯的算法,相比Java7從性能上提升了許多。其中tableSizeFor就是一個例子。tableSizeFor的功能(不考慮大於最大容量的狀況)是返回大於輸入參數且最近的2的整數次冪的數。好比10,則返回16。該算法源碼以下:性能

static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

 詳解以下:優化

先來分析有關n位操做部分:先來假設n的二進制爲01xxx...xxx。接着spa

對n右移1位:001xx...xxx,再位或:011xx...xxxcode

對n右移2爲:00011...xxx,再位或:01111...xxxblog

此時前面已經有四個1了,再右移4位且位或可得8個1源碼

同理,有8個1,右移8位確定會讓後八位也爲1。table

綜上可得,該算法讓最高位的1後面的位全變爲1。class

最後再讓結果n+1,即獲得了2的整數次冪的值了。效率

如今回來看看第一條語句:

int n = cap - 1;

  讓cap-1再賦值給n的目的是另找到的目標值大於或等於原值。例如二進制1000,十進制數值爲8。若是不對它減1而直接操做,將獲得答案10000,即16。顯然不是結果。減1後二進制爲111,再進行操做則會獲得原來的數值1000,即8。

  這種方法的效率很是高,可見Java8對容器優化了不少,很強哈。其餘以後再進行分析吧。

相關文章
相關標籤/搜索