HashMap
2014-04-07 21:29
148 查看
哈希函数
默认容量和加载因子
HashMap 默认初始容量是16(容器中存储的键值对数量),默认加载因子是0.75,而threshold是16*0.75,也就是说一旦大于等于threshold,则会引起容量的扩大,可参考以下代码:(JDK1.5.0)
注意:起始容量必须是2的幂次,具体参照其构造方法可知。
1、相对准确的估算数据量,将极大程度上影响HashMap的性能,因为resize()是一个重新分配的过程,时间开销很大;
2、加载因子较小,则会有更多的空闲空间,选择0.75是在时间和空间上的折中考虑。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括get 和put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低resize操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生resize操作。
ArrayList容量:默认大小是10
List接口是大小可变的数组的实现,实现了所有可选列表操作,并允许包括null在内的所有元素。ArrayList继承List接口,除继承过来的方法外,还提供一些方法来操作内部用来存储列表的数组的大小。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。ArrayList容量变化规则:((旧容量*3)/2)+1
推荐使用
默认容量和加载因子
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]
相关文章推荐
- 第五周作业——有向图邻接表表示及反向图构造
- Hadoop生态圈常用命令
- 判断文件和目录是否存在
- android shape corners 设置无效的解决
- linux下sed的使用(下)
- 集合加法
- 编译CEGUI For Ogre3d
- 4.4 spring-自定义标签的解析
- web farm 讨论引出
- hadoop0.20.2:The temporary job-output directory doesn't exist!
- BAT三巨头们的理想生意:要的就是高毛利
- HDU 4598 Difference
- Android OpenGL ES :材质渲染
- 【JAVA学习】java基本数据类型与字符串之间的转换(基本数据类型、对象封装类、自动装箱、自动拆箱)
- C++11 右值引用
- 探讨:使用httpClient在客户端与服务器端传输对象参数的详解
- CheckBox的使用(三):获取是否选中
- 我开博了
- 码农天气--码农自己的天气APP(一)
- Mongo数据库安装成Windows服务(转)