参考文章:http://blog.csdn.net/itm_hadf/article/details/7497462

通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。
      加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。
      在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。

如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

public class HashMapTest {
public static void main(String[] args) { HashMap<String,String> keySetMap = new HashMap<String,String>();
HashMap<String,String> entrySetMap=new HashMap<String,String>(); for (int i= 0;i<1000;i++) {
keySetMap.put(""+i, "keySet");
}
for(int i=0;i<1000;i++){
entrySetMap.put(""+i,"entrySet");
} long startTimeOne = System.currentTimeMillis();
<strong><span style="color:#ff0000;">Iterator<String> keySetIterator = keySetMap.keySet().iterator();
while (keySetIterator.hasNext()) {
System.out.println(</span><span style="color:#000099;">keySetMap.get(keySetIterator.next())</span><span style="color:#ff0000;">);
}</span></strong>
System.out.println("keyset遍历时间-------------------------------:"+(System.currentTimeMillis()-startTimeOne)); long startTimeTwo=System.currentTimeMillis();
Iterator<Entry<String,String>> entrySetIterator=entrySetMap.entrySet().iterator();
while(entrySetIterator.hasNext()){
Entry<String,String> entry=entrySetIterator.next();
System.out.println(entry.getValue());
}
System.out.println("entryset遍历时间---------------------------:"+(System.currentTimeMillis()-startTimeTwo));
}
}

通过多次运行测试发现,entryset遍历时间比keyset遍历时间短许多,entryset方式的性能通常要比keyset方式高一倍。

正确的使用HashMap


1:不要在并发场景中使用HashMap
           HashMap是线程不安全的,如果被多个线程共享的操作,将会引发不可预知的问题,
   据sun的说法,在扩容时,会引起链表的闭环,在get元素时,就会无限循环,后果是cpu100%。

2:如果数据大小是固定的,那么最好给HashMap设定一个合理的容量值
         根据上面的分析,HashMap的初始默认容量是16,默认加载因子是0.75.
也就是说,如果采用HashMap的默认构造函数,
       当增加数据时,数据实际容量超过10*0.75=12时,HashMap就扩容,扩容带来一系列的运算.新建一个是原来容量2倍的数组,对原有元素全部重新哈希,如果你的数据有几千几万个,而用默认的HashMap构造函数,那结果是非常悲剧的,因为HashMap不断扩容,不断哈希,在使用HashMap的场景里,不会是多个线程共享一个HashMap,除非对HashMap包装并同步,由此产生的内存开销和cpu开销在某些情况下可能是致命的。

最新文章

  1. c3p0的log4j配置
  2. 状态压缩DP--Mondriaan&#39;s Dream
  3. [CareerCup] 2.7 Palindrome Linked List 回文链表
  4. pthread_attr_t 线程属性(二)
  5. Java NIO使用及原理分析(二)
  6. Mysql彻底卸载
  7. git: reset
  8. python 小练习之生成手机号码
  9. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
  10. 【Troywar love Maths】——莫比乌斯反演
  11. 2个监听器+ dialog + replysubject + extends
  12. php在laravel中使用自定义的Common类
  13. KakfaSpout自定义scheme
  14. typecho只能打开主页,文章详细内容打不开
  15. linux服务器ntp客户端配置【转】
  16. python_08 函数式编程、高阶函数、map、filter、reduce函数、内置函数
  17. Beta冲刺(5/5)(麻瓜制造者)
  18. nginx源码安装教程(CentOS)
  19. CentOS6.8系统安装Node
  20. js节流

热门文章

  1. edquota - 编辑用户配额
  2. uva1619 Feel Good
  3. 关闭 macOS Google Chrome 黑暗模式风格
  4. cobbler 无人值守-安装
  5. soc desgin 目前需要做的事情
  6. django下的framework
  7. Python旅途——文件操作
  8. 【转】SQL Server 2008 新数据类型
  9. Python+selenium(Autolt实现上传)
  10. NLS_LANG在客户端不能确定,字符集转变将造成不可预期的后果