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 ...
随机推荐
- EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充
EBS OAF开发中的Java 实体对象(Entity Object)验证功能补充 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) EO理论上 ...
- hdu4055 dp
http://acm.hdu.edu.cn/showproblem.php?pid=4055 Problem Description The signature of a permutation is ...
- Codeforces 468B Two Sets 并查集
题目大意:给出n个数,要求将n个数分配到两个集合中,集合0中的元素x,要求A-x也再0中,同理1集合. 写了几个版本号,一直WA在第8组数据...最后參考下ans,写了并查集过了 学到:1.注意离散的 ...
- Linux多任务编程——进程
进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...
- openssl 非对称加密算法RSA命令详解
1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...
- C#中唯一标识符GUID的一些知识点
概念 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算 ...
- hdu 确定比赛名次
算法:拓扑排序 题意:有一个比赛,现在知道很多队之间的关系:让你去让确定比赛排名: Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,... ...
- shell中的case表达式
语法格式 case var in pattern1 | patter2) command1 command2;; pattern3) command1 command2;; *) default co ...
- 用document.onreadystatechange和document.readyState确保文档加载完毕才获取DOM
document.onreadystatechange = function(){ //document.readyState有“interactive”和“complate”两个值 if(docum ...
- EF有外键的查询
modelBuilder.Entity<ActionMenu>().ToTable("ActionMenu"); modelBuilder.Entity<Acti ...