博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java集合框架 hashMap 简单使用
阅读量:6707 次
发布时间:2019-06-25

本文共 1951 字,大约阅读时间需要 6 分钟。

 参考文章: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
keySetMap = new HashMap
(); HashMap
entrySetMap=new HashMap
(); 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();
Iterator
keySetIterator = keySetMap.keySet().iterator(); while (keySetIterator.hasNext()) { System.out.println(
keySetMap.get(keySetIterator.next())); }
System.out.println("keyset遍历时间-------------------------------:"+(System.currentTimeMillis()-startTimeOne)); long startTimeTwo=System.currentTimeMillis(); Iterator
> entrySetIterator=entrySetMap.entrySet().iterator(); while(entrySetIterator.hasNext()){ Entry
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开销在某些情况下可能是致命的。

你可能感兴趣的文章
接口和抽象类有什么区别
查看>>
Jira7.10.1在Windows环境下的安装和配置
查看>>
shell脚本获取时间、crontab、日志重定向到文件
查看>>
eclipse 中maven项目的运行
查看>>
爬虫第七章 scrapy中间件 + 基于crawlSpider全站爬取网络数据
查看>>
高校学生征信系统Postmortem结果
查看>>
How to Mount a Remote Folder using SSH on Ubuntu
查看>>
iOS开发——高级技术&签名机制
查看>>
关于Spring的配置文件的注解使用
查看>>
linux之SQL语句简明教程---ORDER BY
查看>>
DevExpress中的gridControl选择问题
查看>>
iphone-common-codes-ccteam源代码 CCRect.h
查看>>
iOS开发小技巧--初始化项目中修改APP安装后的名称
查看>>
测试人员应该高大上?!
查看>>
Python全栈开发day4
查看>>
java实现后台自动发邮件功能
查看>>
实现简单ThreadPool
查看>>
开源的api文档管理系统
查看>>
innerHTML innerText与outerHTML间的区别
查看>>
浅谈const限定符
查看>>