失效链接处理 |
Java开发手册(泰山版)_灵魂13问 PDF 下载
本站整理下载:
提取码:8f1l
相关截图:
主要内容:
的:size、loadFactor、threshold、DEFAULT_LOAD_FACTOR 和 DEFAULT_
INITIAL_CAPACITY。
我们先来简单解释一下这些参数的含义,然后再分析他们的作用。
16 > 为什么阿里巴巴建议初始化 HashMap 的容量大小?
HashMap 类中有以下主要成员变量:
● transient int size;
○ 记录了 Map 中 KV 对的个数
● loadFactor
○ 装载印子,用来衡量 HashMap 满的程度。loadFactor 的默认值为 0.75f
(static final float DEFAULT_LOAD_FACTOR = 0.75f;)。
● int threshold;
○ 临界值,当实际 KV 个数超过 threshold 时,HashMap 会将容量扩容,
threshold =容量 * 加载因子
● 除了以上这些重要成员变量外,HashMap 中还有一个和他们紧密相关的概
念:capacity
○ 容量,如果不指定,默认容量是 16(static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;)
可能看完了你还是有点蒙,size 和 capacity 之间有啥关系?为啥要定义这两个
变量。loadFactor 和 threshold 又是干啥的?
size 和 capacity
HashMap 中的 size 和 capacity 之间的区别其实解释起来也挺简单的。我们知
道,HashMap 就像一个“桶”,那么 capacity 就是这个桶“当前”最多可以装多少
元素,而 size 表示这个桶已经装了多少元素。来看下以下代码:
Map<String, String> map = new HashMap<String, String>();
map.put("hollis", "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);
为什么阿里巴巴建议初始化 HashMap 的容量大小? < 17
System.out.println("size : " + size.get(map));
我们定义了一个新的 HashMap,并想其中 put 了一个元素,然后通过反射的方
式打印 capacity 和 size。输出结果为:capacity : 16、size : 1
默认情况下,一个 HashMap 的容量(capacity)是 16,设计成 16 的好处我在
《全网把 Map 中的 hash() 分析的最透彻的文章,别无二家》中也简单介绍过,主要
是可以使用按位与替代取模来提升 hash 的效率。
为什么我刚刚说 capacity 就是这个桶“当前”最多可以装多少元素呢?当前怎
么理解呢。其实,HashMap 是具有扩容机制的。在一个 HashMap 第一次初始化的
时候,默认情况下他的容量是 16,当达到扩容条件的时候,就需要进行扩容了,会
从 16 扩容成 32。
我们知道,HashMap 的重载的构造函数中,有一个是支持传入 initialCapacity
的,那么我们尝试着设置一下,看结果如何。
|