Java 杂谈

打印HashMap扩容时的容量大小

2019-03-06  本文已影响1人  废柴傻狗

思路:利用反射获取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个元素时容器容量大小的变化情况

上一篇下一篇

猜你喜欢

热点阅读