思路:利用反射获取hashmap里的threshold(扩容上限)除以 负载因子 就得到容器大小了。
public class Main {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
HashMap<String, Integer> hashMap = new HashMap<>();
Class clazz = HashMap.class;
// threshold是hashmap对象里的一个私有变量,若hashmap的size超过该数值,则扩容。这是通过反射获取该值
Field field = clazz.getDeclaredField("threshold");
//setAccessible设置为true可以开启对似有变量的访问
field.setAccessible(true);
int threshold = 0;
for (int i = 0; i < 1000; i++) {
hashMap.put(String.valueOf(i), 0);
if ((int) field.get(hashMap) != threshold) {
threshold = (int) field.get(hashMap);
// 默认的负载因子是0.75,也就是说实际容量是/0.75
System.out.println((int) field.get(hashMap) / 0.75);
}
}
}
}
打印结果如下:
16.0
32.0
64.0
128.0
256.0
512.0
1024.0
2048.0
这是hashmap添加1000个元素时容器容量大小的变化情况
网友评论