您的位置:首页 > 其它

HashMap

2014-04-07 21:29 148 查看
哈希函数

默认容量和加载因子

HashMap 默认初始容量是16(容器中存储的键值对数量),默认加载因子是0.75,而threshold是16*0.75,也就是说一旦大于等于threshold,则会引起容量的扩大,可参考以下代码:(JDK1.5.0)

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)///这里是关键,一旦>=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);//重新计算threshold值
}


注意:起始容量必须是2的幂次,具体参照其构造方法可知。

1、相对准确的估算数据量,将极大程度上影响HashMap的性能,因为resize()是一个重新分配的过程,时间开销很大;

2、加载因子较小,则会有更多的空闲空间,选择0.75是在时间和空间上的折中考虑。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括get 和put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低resize操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生resize操作。

ArrayList容量:默认大小是10

List接口是大小可变的数组的实现,实现了所有可选列表操作,并允许包括null在内的所有元素。ArrayList继承List接口,除继承过来的方法外,还提供一些方法来操作内部用来存储列表的数组的大小。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。ArrayList容量变化规则:((旧容量*3)/2)+1

推荐使用
[b]ArrayList(int initialCapacity)的构造方法
[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: