《码出高效》中有这么一句话: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()方法。