HashMap与ConcurrentHashMap性能对比

目的是测试HashMap与ConcurrentHashMap性能

package com.test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;

/**
* HashMap与ConcurrentHashMap性能对比 <br/>
* 在相同条件下分别插入、遍历10W、50W、100W、200W、500W 数据 <br/>
* 记录遍历每种不同数据的耗时<br/>
* 2011-08-30
*
* @author http://www.laoz.net
*
*/
public class TestHashMap {
private static Map<Integer,String> hashMap = new HashMap<Integer,String>();
private static Map<Integer,String> cMap = new ConcurrentHashMap<Integer,String>();

/**
* 测试hashMap put数据
* @param num
*/
public static void testhashMapPut(int num){
long beginTime = System.currentTimeMillis();
for(int i=0;i<num;i++){
hashMap.put(i, "test");
}
System.out.println("HashMap :put耗时" + (System.currentTimeMillis()-beginTime) + "ms");
}

/**
* 测试concurrentHashMap put数据
* @param num
*/
public static void testCMapPut(int num){
long beginTime = System.currentTimeMillis();
for(int i=0;i<num;i++){
cMap.put(i, "test");
}
System.out.println("ConcurrentHashMap :put耗时" + (System.currentTimeMillis()-beginTime) + "ms");
}

/**
* 测试HashMap
*/
public static void testHashMap(){
long beginTime = System.currentTimeMillis();
for(Integer id:hashMap.keySet()){
hashMap.get(id);
}
System.out.println("HashMap :get耗时" + (System.currentTimeMillis()-beginTime) + "ms");
}

/**
* 测试 ConcurrentHashMap
*/
public static void testConcurrentHashMap(){
long beginTime = System.currentTimeMillis();
for(Integer id:cMap.keySet()){
cMap.get(id);
}
System.out.println("ConcurrentHashMap :get耗时" + (System.currentTimeMillis()-beginTime) + "ms");
}

public static void main(String[] args) {
System.out.println("测试10W数据");
testhashMapPut(100000);
testHashMap();
testCMapPut(100000);
testConcurrentHashMap();
System.out.println("==============================");

System.out.println("测试50W数据");
testhashMapPut(500000);
testHashMap();
testCMapPut(500000);
testConcurrentHashMap();
System.out.println("==============================");

System.out.println("测试100W数据");
testhashMapPut(1000000);
testHashMap();
testCMapPut(1000000);
testConcurrentHashMap();
System.out.println("==============================");

System.out.println("测试200W数据");
testhashMapPut(2000000);
testHashMap();
testCMapPut(2000000);
testConcurrentHashMap();
System.out.println("==============================");

System.out.println("测试500W数据");
testhashMapPut(5000000);
testHashMap();
testCMapPut(5000000);
testConcurrentHashMap();
System.out.println("==============================");
}
}

 

测试结果:

测试10W数据
HashMap :put耗时16ms
HashMap :get耗时0ms
ConcurrentHashMap :put耗时46ms
ConcurrentHashMap :get耗时16ms
==============================
测试50W数据
HashMap :put耗时125ms
HashMap :get耗时16ms
ConcurrentHashMap :put耗时250ms
ConcurrentHashMap :get耗时47ms
==============================
测试100W数据
HashMap :put耗时187ms
HashMap :get耗时47ms
ConcurrentHashMap :put耗时500ms
ConcurrentHashMap :get耗时109ms
==============================
测试200W数据
HashMap :put耗时750ms
HashMap :get耗时94ms
ConcurrentHashMap :put耗时1703ms
ConcurrentHashMap :get耗时235ms
==============================
测试500W数据
HashMap :put耗时2093ms
HashMap :get耗时219ms
ConcurrentHashMap :put耗时2906ms
ConcurrentHashMap :get耗时719ms
==============================

 

结论: 结论:无论是put还是get,ConcurrentHashMap耗时约是HashMap的2~3倍

文章来源于网络或者作者投稿,若有侵权请联系删除,作者:老钟,如若转载,请注明出处:https://www.laoz.net/122.html

(0)
老钟
上一篇 2011 年 08 月 30 日 上午 9:47
下一篇 2011 年 08 月 30 日 下午 5:54

相关推荐

  • 判断商标相同或近似的标准

    上如何界定相同或类似商品、服务之后,有必要对相同商标、近似商标的概念再进行界定,之后才有利于认定商标是否相同或近似。 1.相同商标 相同商标是指构成商标的要素完全相同,商标在整体上不存在差别或者只存在细…

    闲话杂谈 2014 年 05 月 23 日
  • 转:电商的促销方式

    看到一张图片,关于电商的促销方式的,归纳的比较全面,分享给大家

    闲话杂谈 2013 年 09 月 10 日
  • Eclipse启动失败,JVM terminated.Exit code=1

    Eclipse启动失败,JVM terminated.Exit code=1解决办法:把eclipse文件夹下的eclipse.ini先copy到别的地方(备份一下),然后删除之,启动一下eclipse

    闲话杂谈 2012 年 05 月 09 日
  • 项目维护时,使用jacob出现的一些问题

    以下是经过搜索,总结网友的一些总结,目前我遇到的问题还没有解决~~ 等重启服务器再试试~   1、如果出现下面的错误 com.jacob.com.ComFailException: A COM exception has been encountered: At Invoke of: V…

    闲话杂谈 2011 年 09 月 16 日
  • java 日期与毫秒转换,计算指定日期后N天

    最近写一些工具类中,遇到一些日期转换的问题,特意把方法分享,其还有很大的改进空间 /** * 把毫秒转化为日期<br/> * 转化后格式为 yyyy-MM-dd HH:mm:ss * * @param ms * @return 日期字符串 */ public stat…

    闲话杂谈 2011 年 09 月 23 日
  • 哪个银行信用卡最好用?哪个银行信用卡最好

    四大国有商业银行: 建设银行: 优点: 1、免首年年费,刷三次免次年年费; 2、短信服务免费; 3、取现手续费仅0.5%; 4、挂失手续费50元; 5、有直接针对有车族信用卡,只要有1.4排量以上的车均能轻松办卡。 缺点…

    闲话杂谈 2011 年 10 月 09 日
  • IO操作中的一个重要注意点

    JAVA是跨平台的语言,所以每个平台的文件地址的表示都不一样 例如:windows d:\src linux d:/src 所以 FileInputStream fi = new FileInputStream("d:/src") ; 应该改为 FileInputStream fi = new FileInputStream("…

    闲话杂谈 2012 年 02 月 16 日
  • 在eclipse中查看android源码

    网上找到一个打包好的源码地址 // 可以直接下载打包好的源码(1.5/16./2.0/2.1/2.2) 地址:http://rgruet.free.fr/public/     例如我在2.2的基础上开发,那么把下载到的2.2源码放到 SDK的这个目录下即…

    闲话杂谈 2012 年 02 月 01 日
  • 买家更换地址,骗局?卖家要注意了~

     近期出现了因卖家的粗心,泄露了买家的个人信息导致买家被骗的情况。小淘提醒各位卖家:买家是卖家的上帝,保护买家的信息是卖家的基本职责。不轻易泄露买家的收货地址,如确有需要请再三确认对方身份。PS:…

    闲话杂谈 2013 年 08 月 19 日
  • windows下部署JAVA项目

    写了一个程序,在eclipse下运行速度挺快的,但是内存消耗太多了,就eclipse这个进程就消耗了200M的内存,再加上java程序的内存消耗,感觉2G的内存有点吃不消!所以,要减少eclipse的内存支出,把java项目直接通过命…

    闲话杂谈 2012 年 10 月 21 日

评论列表(2条)

  • stupid 2012 年 02 月 21 日 上午 11:37

    没见过这么傻X的测试,你要用多线程并发才能测出区别阿!!

    • admin 2012 年 02 月 26 日 下午 4:26

      @stupid是呀,的确是傻X呀~~~
      之前根本不懂~嘿嘿~~