hashmap构造函数
HashMap是Java中常用的数据结构之一,它可以存储键值对,并且能够根据键快速查对应的值。HashMap的实现基于哈希表,它通过哈希函数将键映射到数组的索引位置,从而实现快速的查和操作。
HashMap的构造函数有多个重载形式,不同的构造函数实现了不同的初始化方法。下面将详细介绍各个构造函数的实现原理和使用方式,帮助读者更好地理解HashMap的内部实现和使用方法。
1. HashMap()
HashMap()是HashMap类的默认构造函数,在创建HashMap对象时会被调用。该构造函数会默认为HashMap对象分配一个大小为16的数组,同时将装载因子(load factor)设置为0.75。装载因子表示哈希表在数据存储量达到数组容量的75%时会自动扩容。
具体代码实现如下:
```java
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // 设置装载因子为0.75
}
2. HashMap(int initialCapacity)
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY; // 将初始容量限制在MAXIMUM_CAPACITY以内
this.loadFactor = loadFactor; // 设置装载因子
this.threshold = tableSizeFor(initialCapacity); // 计算哈希表的阈值
}
/**
* 返回大于等于initialCapacity的最小的2的幂次方
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
static final int MAXIMUM_CAPACITY = 1 << 30; // 哈希表的最大容量
```
HashMap(int initialCapacity, float loadFactor)也是HashMap类的带参数构造函数,用于同时指定HashMap对象的初始化容量和装载因子。在该构造函数中会进行各种参数的检查和计算,确保HashMap对象的正常创建。
该构造函数的具体代码实现见上一节。
4. HashMap(Map<? extends K, ? extends V> m)
HashMap(Map<? extends K, ? extends V> m)是HashMap类的拷贝构造函数,用于创建
一个新的HashMap对象,并将参数m中的所有键值对拷贝到新的HashMap对象中。该构造函数中会先调用HashMap()构造函数创建一个默认大小的HashMap对象,然后调用putAll方法将参数m中的所有键值对添加到新的HashMap对象中。
// 创建默认大小的HashMap对象
this.threshold = DEFAULT_INITIAL_CAPACITY;
init();
putMapEntries(m);
}
final void putMapEntries(Map<? extends K, ? extends V> m) {
int s = m.size();
if (s > 0) {
// 调整哈希表的容量和阈值
if (table == null) {
// 如果哈希表未初始化
float ft = ((float) s / loadFactor) + 1.0F;
int t = ((ft < (float) MAXIMUM_CAPACITY) ?
(int) ft : MAXIMUM_CAPACITY);
if (t > threshold)
threshold = tableSizeFor(t);
} else if (s > threshold)
// 如果哈希表已初始化
resize();
for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
构造函数可以被重载 K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, true);
}
}
}
```
以上就是HashMap的所有构造函数的实现原理和使用方法。在实际应用中,我们可以根据需要选择不同的构造函数来创建HashMap对象,并且根据具体的业务场景来设置HashMap的初始化容量、装载因子和访问顺序等参数,以实现更高效、更灵活的数据结构设计。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论