《码出高效》中有这么一句话:HashMap 容量并不会在 new 的过程中分配,而是在第一次 put 的时候完成创建。
文中的源码环境是 JDK11。
我在本地环境 JDK8 的代码里这样写:
// 未显式初始化容量大小
Map<String, String> map = new HashMap<>();
Class<?> mapClazz = map.getClass();
Method capacity = mapClazz.getDeclaredMethod("capacity");
capacity.setAccessible(true);
System.out.println("不显式的初始化,容量大小为:" + capacity.invoke(map));
输出的结果为:不显式的初始化,容量大小为:16。
我以为会和ArrayList
一样,未显式初始化,容量大小是 0,只有调用一次 add 方法后,才会扩容成默认值的容量大小。
那《码出高效》这句话该怎么解释好呢?是 JDK 版本的问题吗?反射的是capacity()
方法。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.