大家直接看测试代码
import java.util.HashMap;
import java.util.Map;
public class TestHashMap {
static final int MAXIMUM_CAPACITY = 1 << 30;
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;
}
public static void main(String[] args) {
//0:1 1:1 2:2 3:4 4:4 5:8 6:8 7:8 8:8 9:16 10:16 11:16 12:16 13:16 14:16 15:16 16:16
//17:32 18:32 19:32 20:32 21:32 22:32 23:32 24:32 25:32 26:32 27:32 28:32 29:32 30:32 31:32 32:32
//33:64
for(int i = 0 ;i<34;i++) {
System.out.print(i+":"+tableSizeFor(i)+" ");
}
System.out.println("begin");
//默认初始化容量 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//默认负载因子 0.75
Map<String,String> map = new HashMap<>();
/*
* put 到 initialCapacity * loadFactor 16*0.75= 12(threshold) 阈值 的下一次 第13个元素时再次resize() ,
* 扩容为 当前cap*2 = 32. 则下次触发resize()的时机为 32 * 0.75 = 24的下一个,即第25个
*/
int threshold = 12;
for(int i =0;i<100;) {
if(i==0) {
map.put("key"+(++i), "value"+(i));//第一次触发resize().
System.out.println(threshold);
}
else {
if(i == threshold) {
threshold = threshold << 1;//threshold * 2;
System.out.println(threshold);
map.put("key"+(++i), "value"+(i));
}else {
map.put("key"+(++i), "value"+(i));
}
}
}
System.out.println(map.size());
}
}