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對容器優化了不少,很強哈。其餘以後再進行分析吧。