"HashMap 的扩容条件就是当 HashMap 中的元素个数(size)超过临界值( threshold)时就会自动扩容。 在 HashMap 中,threshold = loadFactor * capacity。 loadFactor 是装载因子,表示 HashMap 满的程度,默认值为 0.75f,设置成 0.75 有一个好处,那就是 0.75 正好是 3/4,而 capacity 又是 2 的幂。所以,两个数的乘积都是整数。 对于一个默认的 HashMap 来说,默认情况下,当其 size 大于 12(16*0.75)时就会触发扩容。 验证代码如下: console.log(1)``console.log (Map<String, String> map = new HashMap<>(); map.put(""hollis1"", ""hollischuang""); map.put(""hollis2"", ""hollischuang""); map.put(""hollis3"", ""hollischuang""); map.put(""hollis4"", ""hollischuang""); map.put(""hollis5"", ""hollischuang""); map.put(""hollis6"", ""hollischuang""); map.put(""hollis7"", ""hollischuang""); map.put(""hollis8"", ""hollischuang""); map.put(""hollis9"", ""hollischuang""); map.put(""hollis10"", ""hollischuang""); map.put(""hollis11"", ""hollischuang""); map.put(""hollis12"", ""hollischuang""); Class<?> mapType = map.getClass(); Method capacity = mapType.getDeclaredMethod(""capacity""); capacity.setAccessible(true); System.out.println(""capacity : "" + capacity.invoke(map)); Field size = mapType.getDeclaredField(""size""); size.setAccessible(true); System.out.println(""size : "" + size.get(map)); Field threshold = mapType.getDeclaredField(""threshold""); threshold.setAccessible(true); System.out.println(""threshold : "" + threshold.get(map)); Field loadFactor = mapType.getDeclaredField(""loadFactor""); loadFactor.setAccessible(true); System.out.println(""loadFactor : "" + loadFactor.get(map)); map.put(""hollis13"", ""hollischuang""); Method capacity = mapType.getDeclaredMethod(""capacity""); capacity.setAccessible(true); System.out.println(""capacity : "" + capacity.invoke(map)); Field size = mapType.getDeclaredField(""size""); size.setAccessible(true); System.out.println(""size : "" + size.get(map)); Field threshold = mapType.getDeclaredField(""threshold""); threshold.setAccessible(true); System.out.println(""threshold : "" + threshold.get(map)); Field loadFactor = mapType.getDeclaredField(""loadFactor""); loadFactor.setAccessible(true); System.out.println(""loadFactor : "" + loadFactor.get(map));)
输出结果: capacity : 16 size : 12 threshold : 12 loadFactor : 0.75 capacity : 32 size : 13 threshold : 24 loadFactor : 0.75 当 HashMap 中的元素个数达到 13 的时候,capacity 就从 16 扩容到 32 了。 HashMap 中还提供了一个支持传入 initialCapacity,loadFactor 两个参数的方法,来初始化容量和装载因子。不过,一般不建议修改 loadFactor 的值。
资料来源:《Java工程师成神之路(基础篇)》,链接:https://developer.aliyun.com/topic/download?id=923"
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。