[Java] 多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

比较Java原生的 3种Map的效率。
1.  TreeMap
2.  HashMap

3.  ConcurrentSkipListMap

结果:

模拟150W以内海量数据的插入和查找,通过增加和查找两方面的性能测试,结果如下:










































Map类型 插入 查找(在100W数据量中)
  10W 50W 100W 150W 0-1W 0-25W 0-50W
Concurrent

SkipListMap
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比较简单,实现起来会比较容易,虽然和平衡树有着相同的时间复杂度(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比较容易实现,而且相比平衡树有着较高的运行效率。

本测试的增加功能,ConcurrentSkipListMap和TreeMap效率相差不大。

查找功能在50W数据量以后,TreeMap更有效率,因为ConcurrentSkipListMap自带锁机制,会占用一些效率,但对于多线程并发的环境下,ConcurrentSkipListMap的效率会比Treep要好的。

本测试查找方法使用Map的get方法,循环、离散获取。对于ConcurrentSkipListMap,获得顺序片段,可用subMap()方法,提取
50w的子序列只需要1ms,具有巨大优势。 SkipListMap的范围查询效率比HashMap和TreeMap效率都要高。

(3) SkipList 参考资料

[1] http://stackoverflow.com/questions/256511/skip-list-vs-binary-tree
[2]
http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html
[3]
http://imtinx.iteye.com/blog/1291165

[Java]
多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap),布布扣,bubuko.com

[Java]
多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

时间: 2024-10-14 13:14:12

[Java] 多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)的相关文章

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

Java——(八)Map之LinkedHashMap、TreeMap、EnumMap实现类

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.LinkedHashMap实现类 LinkedHashMap需要维护意识的插入顺序,因此性能略低于HashMap的性能:但因为它以 链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能.下面示范了 LinkedHashMap的功能. 1 import java.util.LinkedHashMap; 2 3 public class LinkedHashMapTest {

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 HashM

Java多线程 -- Map容器性能比较

单线程 单线程环境下可以使用HashMap和TreeMap.TreeMap上遍历返回结果是按照Key排序的. 测试方法 记录写入Map中N条记录的时间,单位毫秒. 记录从N条记录的Map中读取10W条记录的时间,单位毫秒. N=25W,50W,75W,100W 测试结果 写N条记录 25W  50W  75W  100W HashMap 28 49 72 92 TreeMap 131 321 527 748 N条记录中读10W数据 25W  50W  75W  100W HashMap 4 5

JavaSE入门学习37:Java集合框架之Map接口及其实现类HashMap和TreeMap

一Map接口 Map接口中的每个成员方法由一个关键字(key)和一个值(value)构成.Map接口不直接继承于Collection接口,因 为它包装的是一组成对的"键-值"对象的集合,而且在Map接口的集合中也不能有重复的key出现,因为每个键只能与 一个成员元素相对应. Map接口定义了存储"键(key)--值(value)映射对"的方法.实现Map接口的类用来存储键值对.Map接口中包含 了一个keySet()方法,用于返回Map中所有key组成的Set集合.

Java集合之Map接口

Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到 一个值.Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap 1)HashMap 基于哈希表(哈希表学习地址)的Map接口实现.允许使用null值和null键,不保证映射的顺序,特 别是不保证顺序恒久不变.它除了非同步和允许使用null外,与Hashtable大致相同. HashMap实现原理: 1.HashMap默认数组大小为16,加载因子为0.75

(转)list 、set 、map 粗浅性能对比分析

本文分开介绍了List.Map.Set: (测试环境:win7.jdk.4G.i3:文章示例为了节省篇幅,只会列出测试大体形式和遍历次数) 第一部分:List 1.add(E e) ==============================性能测试================================= (1)表格统计的差异在于new的方式不同: [java] view plaincopy for (int i = 0; i < 10000; i++) { List<Integer

Java中的Map List Set等集合类

Map List Set等集合类: 一.概述 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父子关系: +Collection 这个接口extends自 --java.lang.Iterable接口 ├+List(接口 代表有序,可重复的集合.列表) │├ ArreyList     (Class 数组,随机访问,没有同步,线程不安全) │├ Vector        (Class  数组                   同步        线程全) │

java并发容器(Map、List、BlockingQueue)

转发: 大海巨浪 Java库本身就有多种线程安全的容器和同步工具,其中同步容器包括两部分:一个是Vector和Hashtable.另外还有JDK1.2中加入的同步包装类,这些类都是由Collections.synchronizedXXX工厂方法.同步容器都是线程安全的,但是对于复合操作,缺有些缺点: ① 迭代:在查觉到容器在迭代开始以后被修改,会抛出一个未检查异常ConcurrentModificationException,为了避免这个异常,需要在迭代期间,持有一个容器锁.但是锁的缺点也很明显