打印HashMap扩容时的容量大小

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里...
    liangzzz阅读 12,412评论 7 102
  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    曹振华阅读 7,198评论 1 37
  • 承不躁之情 染纯色之黑…许是有人说了很多的茫茫 许是沉寂的时间过长 许是日月不解风情 许是插肩而过的浪漫只是插肩 ...
    陋白阅读 2,444评论 0 0
  • 过去的回忆 带不走曾经的你 明天的故事 等着你书写 年少的你 在梦中 你大笑 你哭泣 因为你想年少的你
    大湿人阅读 1,566评论 3 1
  • 唔……今天总结什么呢?( ⁼̴̶̤̀ 오 ⁼̴̶̤́ ) 今天来个萌萌系列吧!哈哈哈!甜滋滋的说话,嘻嘻~ 今天吧...
    KarenLee开心阅读 1,410评论 0 4