咱們知道在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