理想情況下HashMap的時間復雜度為O(1),因為對於內存來說,訪問任何地址的時間是一樣的,即時間極短,相當於可以同時訪問到所有地址。
而在時間復雜度為O(1)時,需要很大的內存空間,所以必須要對內存和時間進行取舍。
咋取舍呢,hashmap在初始化的時候有倆值,初始大小和負載因子,默認是16和0.75
大小不用解釋,負載因子就是一個小數,擴容的時候用的,在put的時候,hashmap就檢查一下自己的大小,是不是大於16x0.75(大小x負載因子),如果是,就擴容,擴容到2^n,為啥是這個呢,我看了很多資料,
hash值要進行取余運算,而數學證明,hash%(2^n)=hash^(2^n-1),為了效率,就采用了2倍的擴容。ps:^為異或,2^n為2的n次方
面試題:初始構造器設置大小為25,hashmap實際大小是多少?
實際是64,首先,找到比25大的2^n,是32,負載因子為0.75,則能裝24個,25>24,觸發擴容,為64.
下面是hash運算的源碼
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }