爲何HashMap的容量必須爲2的N次方?什麼原理?

咱們知道在HashMap的初始化默認容量是16。經過構造方法能夠設定一個初始化容量的參數initialCapacity,可是HashMap的構造方法內是這樣寫的:數組

while (capacity < initialCapacity)  
        capacity <<= 1;

也就是說實際上容量仍是一個2的N次方的數。code

爲何非要這樣?毫無疑問是由於效率! 可是仍是來看看原碼是怎樣實現的:索引

static int indexFor(int h, int length) {  
    return h & (length-1);  
}

這是HashMap中的一個調用最頻繁的方法,用於計算一個Key對應的Hash桶的索引,Hash桶放在一個數組中,這個方法返回的就是數組的索引,爲了更加平均的分配容器內的元素,採用的是取模運算來分配。參數裏的h就是key的hashCode,length就是容量capacity。ci

這裏假如h爲70(二進制:0100 0110),length爲64(二進制:0100 0000),length-1也就是63(二進制:0011 1111)。hash

h & (length-1) =01000110 & 00111111=110(十進制正好爲6 ==length % h)

能夠看到,若是length爲2的N次方,取模運算能夠變成位與運算,效率顯著提升!可是要浪費一些空間。it

相關文章
相關標籤/搜索