Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)
问题
比較Java原生的
1. TreeMap
2. HashMap
3. ConcurrentSkipListMap
3种Map的效率。
结果
模拟150W以内海量数据的插入和查找,通过添加和查找双方面的性能測试,结果例如以下:
| Map类型 | 插入 | 查找(在100W数据量中) | |||||
| 10W | 50W | 100W | 150W | 0-1W | 0-25W | 0-50W | |
| ConcurrentSkipListMap | 62 ms | 227 ms | 433 ms | 689ms | 7 ms | 80 ms | 119 ms |
| HashMap | 18 ms | 93 ms | 217 ms | 303ms | 2 ms | 13 ms | 45 ms |
| TreeMap | 33 ms | 228 ms | 429 ms | 584 ms | 4ms | 34 ms | 61 ms |
分析说明
图1- 1常数和logn函数效率对照演示样例图(横轴-n数据量,纵轴-f(n)时间)
TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。
HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。
ConcurrentSkipListMap是基于跳表实现的,时间复杂度平均能达到O(log n)。
如图所看到的:
当数据量添加时,HashMap会引起散列冲突,解决冲突须要多花费一些时间代价,故在f(n)=1向上浮动。
随着数据量的添加,HashMap的时间花费小且稳定,在单线程的环境下比TreeMap和ConcurrentSkipListMap在插入和查找上有非常大的优势。
(1) TreeMap与HashMap相比較
Ø HashMap里面存入的键值对在取出的时候是随机的,它依据键的HashCode值存储数据,依据键能够直接获取它的值,具有非常快的訪问速度。在Map 中插入、删除和定位元素,HashMap是最好的选择。
Ø TreeMap取出来的是排序后的键值对。插入、删除须要维护平衡会牺牲一些效率。但假设要按自然顺序或自己定义顺序遍历键,那么TreeMap会更好。
本測试添加和查找功能,HashMap比TreeMap的效率要高。
(2) TreeMap与ConcurrentSkipListMap相比較
Ø Skip list(跳表)是一种能够取代平衡树的数据结构,默认是依照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每一个节点中添加了向前的指针,在插入、删除、查找时能够忽略一些不可能涉及到的结点,从而提高了效率。
从概率上保持数据结构的平衡比显示的保持数据结构平衡要简单的多。对于大多数应用,用Skip list要比用树算法相对简单。因为Skip list比較简单,实现起来会比較easy,尽管和平衡树有着同样的时间复杂度(O(logn)),可是skip list的常数项会相对小非常多。Skip list在空间上也比較节省。一个节点平均仅仅须要1.333个指针(甚至更少)。
图1-2 Skip list结构图(以7,14,21,32,37,71,85序列为例)
Skip list的性质
(1) 由非常多层结构组成,level是通过一定的概率随机产生的。
(2) 每一层都是一个有序的链表,默认是升序,也能够依据创建映射时所提供的Comparator进行排序,详细取决于使用的构造方法。
(3) 最底层(Level 1)的链表包括全部元素。
(4) 假设一个元素出如今Level i 的链表中,则它在Level i 之下的链表也都会出现。
(5) 每一个节点包括两个指针,一个指向同一链表中的下一个元素,一个指向以下一层的元素。
Ø ConcurrentSkipListMap具有Skip list的性质 ,而且适用于大规模数据的并发訪问。多个线程能够安全地并发运行插入、移除、更新和訪问操作。与其它有锁机制的数据结构在巨大的压力下相比有优势。
Ø TreeMap插入数据时平衡树採用严格的旋转(比方平衡二叉树有左旋右旋)来保证平衡,因此Skip list比較easy实现,并且相比平衡树有着较高的执行效率。
本測试的添加功能,ConcurrentSkipListMap和TreeMap效率相差不大。
查找功能在50W数据量以后,TreeMap更有效率,由于ConcurrentSkipListMap自带锁机制,会占用一些效率,但对于多线程并发的环境下,ConcurrentSkipListMap的效率会比Treep要好的。
本測试查找方法使用的时候map的get方法。对于ConcurrentSkipListMap,获得顺序片段,可用subMap()方法,提取50w的子序列仅仅须要1ms,具有巨大优势。 ConcurrentSkipListMap的效率比HashMap和TreeMap效率都要高。
Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)的更多相关文章
- Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)
比较Java原生的 3种Map的效率. 1. TreeMap 2. HashMap 3. ConcurrentSkipListMap 模拟150W以内海量数据的插入和查找,通过增加和查找两方面的 ...
- java list三种遍历方法性能比較
从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...
- Java——(八)Map之LinkedHashMap、TreeMap、EnumMap实现类
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.LinkedHashMap实现类 LinkedHashMap需要维护意识的插入顺序,因此性能 ...
- 【Java学习笔记】Map借口的子接口----HashMap
存储在HashMap集合中的元素,必须覆盖hashCode和equals方法(与HashSet类似) import java.util.HashMap; import java.util.Iter ...
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- Java笔记(二十三)……Map集合
Map接口 Map<K,V> 该集合存储的是键值对,成对往集合里存,而且要保证键的唯一性 常用方法 添加 Vput(K key, V value) voidputAll(Map<? ...
- java中将list、map对象写入文件
链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html 推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个 ...
- 转:JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...
- java集合框架07——Map架构与源代码分析
前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...
随机推荐
- C# IoC 容器
Unity是Unity是微软patterns& practices组用C#实现的轻量级,可扩展的依赖注入容器,它为方便开发者建立松散耦合的应用程序, 有以下优点: 1.简化了对象的创建,特别是 ...
- 关于SVN版本控制器的问题与解决方法
1.SVN Working copy is too old 有个.svn的文件夹,去掉在commit试试! 2.中文字符变乱码 尽量不要用中文命名文件,因为很多软件对中文的支持还是有不好的地方.
- 注意:"AspNetPager”的控件“AspNetPager1”必须放在具有 runat=server 的窗体标记内
应加: <form id="form1" runat="server"> </form> 否则一开始什么也不显示,页面控件看不见,加上a ...
- asp.net读取文件
context.Response.ContentType = "text/html"; string fullpath = context.Server.MapPath(" ...
- Android-Context的IO功能
如何将应用数据保存到本地文件?如何从本地文件加载数据到应用中?我实现的步骤是: 应用(java数据)<--org.json-->JSONString<--Context.IO--&g ...
- Java性能漫谈-数组复制之System.arraycopy
当我还年幼的时候,我很任性,复制数组也是,写一个for循环,来回倒腾,后来长大了,就发现了System.arraycopy的好处. 为了测试俩者的区别我写了一个简单赋值int[100000]的程序来对 ...
- JDBC 异常特殊原因 (数据库只读解决办法)
JDBC 异常特殊原因 有时候并不是因为程序写的有问题 ,是因为 数据库只读 在sqlserver2005中附加数据库时,附加的数据库会变成只读的,只能进行查询操作. 解决方法: 1 打开Sq ...
- cellForRowAtIndexPath方法不执行的那些坑
今天用到了uitableview,是xib形式的.不过cellForRowAtIndexPath方法死活不执行,检查了返回的row数量,section的数量,数据源,代理都没问题,不过cellForR ...
- web开发常用样式
1.div保持底部浮动(不受滚动条影响) position:fixed;_position:absolute;bottom:0px;_bottom:0px;_margin-top:expression ...
- 分布式Session共享(二):tomcat+memcached实现session共享
一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...