按HashMap源码里的那种重构方法,如果reHash过多,显然会影响性能。所以为了防止过多的reHash,我们需要自己配置HashMap的装载因子loadFactor和初始的table容量capacity的大小(可以在构造函数里配或者调用方法配)。
很容易理解,如果我们已经知道我们使用的HashMap一般情况的存储在1W对以上,你给它一个默认的16的初始的table容量,默认reHash每次容量翻倍,这得重构多少次呀!(如果装载因子为1,还得要约5~6次)。但是如果我们的对HashMap的容量需求不是很大,你给它一个默认1W的容量,显然又浪费宝贵的空间了。至于这两个参数的选择可以自己去把握,甚至可以设定动态绑定:分析历史数据,找出规律,或者预测未来的走向找出规律。对HashMap这两个参数实现一个动态的调整。比如早上8点~9点A业务比较忙,它对应的HashMap可以提前多给些空间,而10点以后B业务使用的HashMap比较忙,A相对清闲,可以缩减A的空间给B。
如果从数据库的表中读取记录存入HashMap中,完全可以根据记录的行数(row size)来初始化HashMap的容量,这样就可以达到reHash的最少次数,同时也保证了HashMap所需的最小容量:
比如:通过SQL语句: select count(字段) as rowSize from 表
提到行数: rowSize = 30
那么我们在定义HashMap的时候: HashMap<String,String> h = new HashMap<String,String>(rowSize,1f);
下面是HashMap的相关源代码部分:
_____________________________________________
//HashMap的构造
public HashMap(int initialCapacity, float loadFactor) {
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);
// Find a power of 2 >= initialCapacity
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
this.loadFactor = loadFactor;
threshold = (int)(capacity * loadFactor);
table = new Entry[capacity];
init();
}
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
//添加新的项目
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold) //注意理解这里,当前的实际大小(size)与threshold相等时,就将当前的容量扩大一倍
{
resize(2 * table.length);
}
}
//重构大小
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];
transfer(newTable);
table = newTable;
threshold = (int)(newCapacity * loadFactor);
}
分享到:
相关推荐
3. **指定初始容量和加载因子的构造函数** `HashMap(int initialCapacity, float loadFactor)`:创建一个具有指定初始容量和加载因子的空`HashMap`。 4. **基于另一个映射创建的构造函数** `HashMap(Map, ? extends...
3. HashMap(int initialCapacity, float loadFactor):创建指定初始容量和自定义加载因子的HashMap。 初始容量是指HashMap创建时分配的数组大小,而加载因子则定义了在扩容前HashMap可以达到的填充程度。当HashMap...
HashMap有多个构造函数,但我们主要关心的是`HashMap(int initialCapacity)`,它允许我们指定HashMap的初始容量。在默认的情况下,HashMap的容量是16。但是,如果我们通过构造函数指定了一个数字作为容量,那么...
在Java中,HashMap的初始化涉及两个重要属性:initialCapacity(初始容量)和loadFactor(负载因子)。initialCapacity定义了HashMap的初始大小,而loadFactor定义了在何时进行扩容的阈值。默认情况下,...
上午: Map 集合 key-value key 无序无重复 value 无序可重复 ...HashMap(int initalCapacity,float loadFactor)具有指定的初始容量和负载因子 HashMap(Map,?extends V> m)HashMap与指定相同的映射 Map 4.常用方法
Java 在 HashMap 初始化时赋初值过程解析 ...本文介绍了 Java 中的 HashMap 初始化时赋初值过程解析,包括使用双括号进行初始化的语法和可能导致的串行化失败的问题,以及解决办法。希望对大家的学习有所帮助。
- 选择合适的初始容量(initialCapacity)和负载因子,以优化HashMap的性能。初始容量越大,扩容次数越少,但内存占用也会增加。 - 注意HashMap的并发问题,如果在多线程环境下,使用Collections.synchronizedMap()...
HashMap 的初始化阶段有三个常量:DEFAULT_INITIAL_CAPACITY(初始容量)、MAXIMUM_CAPACITY(最大容量)和 DEFAULT_LOAD_FACTOR(装载因子)。HashMap 的构造方法有两个,一个是无参构造方法,另一个是包含 ...
java hashmap 扩容因子为什么是0.75,官方给出的解释
- **初始容量和加载因子**:`HashMap`同样允许设置初始容量和加载因子。与`HashTable`一样,默认的加载因子为0.75。 - **弱引用**:`HashMap`有一个子类`WeakHashMap`,其中的键是弱引用。这意味着如果一个键没有...
这三个构造函数分别创建了具有默认初始容量和加载因子的空HashMap、具有指定初始容量和默认加载因子的空HashMap、和具有指定初始容量和加载因子的空HashMap。 HashMap的数据结构是一种“链表散列”,它由一个数组和...
3. **负载因子**:HashMap有一个名为`loadFactor`的属性,用于控制当HashMap达到多大容量时需要进行扩容。默认负载因子为0.75,意味着当HashMap实际使用的容量达到其容量的75%时,会自动扩容。 4. **扩容机制**:当...
- 当负载因子超过0.75时,`HashMap`会自动扩容,新的容量为原来的两倍。这种扩容策略有助于保持良好的性能。 - **HashTable**: - 默认大小为11。`HashTable`不对指定的初始容量进行特殊处理,因此可能不是2的幂。...
HashMap的构造函数允许用户自定义初始容量和装载因子。如果用户没有提供,将会使用默认值。例如,`public HashMap(int initialCapacity, float loadFactor)` 构造函数会检查输入的有效性,并根据传入的参数计算出...
2. **装载因子**:装载因子是HashMap的一个关键参数,表示已存储元素数量与数组大小的比率。默认装载因子为0.75,当元素数量达到装载因子与数组长度乘积时,HashMap会自动进行扩容。扩容会创建一个新的更大的数组,...
在本分析中,我们将会详细探讨HashMap在不同负载因子(loadFactor)、循环次数(loop)、哈希表长度(maptablelen)和映射长度(maplen)等条件下的行为和特性。 负载因子(loadFactor)是HashMap中的一个关键参数...
HashMap的构造函数允许用户指定初始容量(initialCapacity)和负载因子(loadFactor)。如果初始容量小于0或负载因子非正数,构造函数会抛出IllegalArgumentException。初始化时,HashMap并不会立即创建数组,而是...