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)

时间: 2024-11-05 16:24:18

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

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

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

java list三种遍历方法性能比較

从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象,測试代码例如以下: package com.hisense.tiger.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListTest { publi

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中arraylist和linkedlist源代码分析与性能比較

Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arraylist和linkedlist的性能. 2,arraylist源代码分析 Arraylist底层的数据结构是一个对象数组.有一个size的成员变量标记数组中元素的个数,例如以下图: * The array buffer into which the elements of the ArrayLis

java中将list、map对象写入文件

链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html 推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个人中心发博文消息 doudouhe的博客 http://blog.sina.com.cn/dechuan608hewei [订阅][手机订阅] 首页博文目录图片关于我 个人资料 doudouhe 微博 加好友发纸条 写留言加关注 博客等级: 博客积分:842 博客访问:222,144 关注人气:34 获赠金

java里,当long与上了int

long switchState = 0xf0000000000L; int result = (switchState & 0xff00000000L) > 0 ? 0x01 : 0x00; 你认为result是多少?1 result = (switchState & 0xff000000) > 0 ? 0x01 : 0x00; 你认为result是多少?1 [还是没有全然领悟这个情况.] result = (switchState & 0xff000000L) &g

(转载)Java里新建数组及ArrayList java不允许泛型数组

java中新建数组: String[] s;//定义的时候不需要设置大小 s = new String[5];//为数组分配空间时就要设置大小 对于ArrayList, ArrayList<String> result = new ArrayList<String>(); //这时候就不需要设置大小了,result.add(string)添加一个元素,result.remove(string)删除一个元素,大小可以由result.size()得到 再来看看 java里允许Map[]

Java中的集合Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap(五)

Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的key不容许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false. key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的.确定的value.从Map中取出数据时,只要给出指定的key,就可以取出对应的value. 如果把Map里的所有key放在一起看