HashMap 初始化(1.7)
程序员文章站
2022-06-04 19:22:43
...
size
size表示HashMap中存放KV的数量(为链表和树中的KV的总和)。
capacity
capacity译为容量。capacity就是指HashMap中桶的数量。默认值为16。一般第一次扩容时会扩容到64,之后好像是2倍。总之,容量都是2的幂。
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
loadFactor
loadFactor译为装载因子。装载因子用来衡量HashMap满的程度。loadFactor的默认值为0.75f。计算HashMap的实时装载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
threshold
threshold表示当HashMap的size大于threshold时会执行resize操作。
threshold=capacity*loadFactor
/**
* The next size value at which to resize (capacity * load factor).
*/
int threshold;
HashMap map = new HashMap();
1.7的hashmap初始化一共有三个构造函数:
public HashMap(int initialCapacity, float loadFactor) {
//如果桶长度<0,抛出异常。
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
//如果长度>最大长度,长度为最大长度。
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
//此时并不会创建容器,因为没有 传具体值
// 没设置扩容大小
/**
* 此时并不会创建容器,因为没有传具体值。
* 当下次传具体值的时候,才会“根据这次的初始容量”,创建一个内部数组。
* 所以此次的初始容量只是作为下一次扩容(新建)的容量。
*/
threshold = initialCapacity;
//该方法只在LinkedHashMap中有实现,主要在构造函数初始化和clone、readObject中有调用。
init();
}
/**
* Constructs an empty <tt>HashMap</tt> with the specified initial
* capacity and the default load factor (0.75).
*
* @param initialCapacity the initial capacity.
* @throws IllegalArgumentException if the initial capacity is negative.
*/
public HashMap(int initialCapacity) {
//传入初始化参数,则调用按照初始化参数初始化hashmap
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
/**
* Constructs an empty <tt>HashMap</tt> with the default initial capacity
* (16) and the default load factor (0.75).
*/
public HashMap() {
//默认的16和装载因子0.75
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
}
/**
* 根据已有map对象生成一个hashmap,初始容量与传入的map相关,负载因子使用默认值
* @param m Map对象
*/
public HashMap(Map<? extends K, ? extends V> m) {
//生成空数组,并指定扩容值
this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) + 1, DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
//由于此时数组为空,所以使用“扩容临界值”新建一个数组
inflateTable(threshold);
//将传入map的键值对添加到初始数组中
putAllForCreate(m);
}
转载于:https://my.oschina.net/zhangtuoDMU/blog/899010
上一篇: 初识HashMap
下一篇: Linux笔记10_源码安装nginx