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效率都要高。
转载于:https://www.cnblogs.com/mengfanrong/p/3817145.html
Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)相关推荐
- java 集合之Interface Map<K,V> HashMap实现类
java 集合之Interface Map<K,V> 类型参数:K- 此映射所维护的键的类型:V- 映射值的类型 将键映射到值的对象. 一个映射不能包含重复的键: 每个键最多可以映射到一个 ...
- java list三种遍历方法性能比較
从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...
- java集合框架07——Map架构与源代码分析
前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...
- JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...
- Java里的容器 Collection 简介
容器也是Java面试经常问到的问题. 也是Java编程的其中1个难点. 在一篇文章中很难全部讲清楚, 我打算分几篇逐步介绍. 一. 什么是容器 1.1 容器的定义 Java里的容器的定义很简单: ...
- java 里如何实现逻辑返回值_☆技术问答集锦(五)
1 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别 区别主要答两点: 条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型: 逻辑操作不会产生短 ...
- EL在java里的意义
EL在java里的意义: EL的语法很简单,他最大的特点就是使用上很方便 例: ${sessionScope.user.sex} 所有EL都是以 ${ 为起始.以} 为结尾的. 上述EL范例的意思是: ...
- java 先进先出的map_「 深入浅出 」java集合Collection和Map
本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...
- 在Java里重写equals和hashCode要注意什么问题
问题:在Java里重写equals和hashCode要注意什么问题 重写equals和hashCode有哪些问题或者陷阱需要注意? 回答一 理论(对于语言律师或比较倾向于数学的人): equals() ...
- Java—Map集合详解(HashMap/Hashtable/LinkedHashMap/Properties/TreeMap/WeakHashMap/IdentityHashMap/EnumMap)
关注微信公众号:CodingTechWork,一起学习进步. Map Map集合介绍 Map(也称为字典.关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何 ...
最新文章
- telecom js
- C#学习系列之二:变量
- oracle 设置查询条数,SQL、MySQL、Oracle、 Sqlite、Informix数据库查询指定条数数据的方法...
- 工厂设计模式–一种有效的方法
- Navicat15安装笔记
- void和void *
- php转调页面,PHP中HTTP防盗链技术
- R7-3 出租 (20 分)
- 人生第一个深入理解的DFS题 HDU 1016
- linux 修改时间 date
- 对+=赋值运算符的认识
- 多光谱、高光谱与雷达数据等产品级划分标准
- 转贴:水晶报表动态加载图片(签名)
- 开源跨平台计算机视觉库OpenCV 4.0正式发布
- 南极沉船_世界上一些神秘的沉船,都成了仿佛被世界遗弃的盛景
- 大众点评字体_【网络爬虫实战】解决大众点评搜索页面字体加密
- 2020年IT技术的发展趋势!
- 高项47个过程及输入、输出、工具解释
- 【MyBatis-Plus】CRUD 操作
- vue3中reactive赋值失败