问题

比較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)的更多相关文章

  1. Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

    比较Java原生的 3种Map的效率. 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 模拟150W以内海量数据的插入和查找,通过增加和查找两方面的 ...

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

    从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...

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

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.LinkedHashMap实现类 LinkedHashMap需要维护意识的插入顺序,因此性能 ...

  4. 【Java学习笔记】Map借口的子接口----HashMap

    存储在HashMap集合中的元素,必须覆盖hashCode和equals方法(与HashSet类似)   import java.util.HashMap; import java.util.Iter ...

  5. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  6. Java笔记(二十三)……Map集合

    Map接口 Map<K,V> 该集合存储的是键值对,成对往集合里存,而且要保证键的唯一性 常用方法 添加 Vput(K key, V value) voidputAll(Map<? ...

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

    链接地址:http://blog.sina.com.cn/s/blog_4a4f9fb50101p6jv.html     推荐:凤爪女瓜子男怪象该谁反思伦敦房价为什么持续暴涨 × wvqusrtg个 ...

  8. 转:JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...

  9. java集合框架07——Map架构与源代码分析

    前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...

随机推荐

  1. MongoDB 的 MapReduce 大数据统计统计挖掘

    MongoDB虽然不像我们常用的mysql,sqlserver,oracle等关系型数据库有group by函数那样方便分组,但是MongoDB要实现分组也有3个办法: * Mongodb三种分组方式 ...

  2. Linux gdb调试入门

    没有使用过gdb调试过程序的觉得gdb是个很神奇的东东,如果你使用它调试一次保证你想忘记它都难,下面看看它的庐山真面目吧! GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. ...

  3. open(),close() 打开/关闭文件

    Open open()是一个系统调用函数,用来打开或创建一个文件,通过不同的oflag选项实现不同功能. 使用时open()函数需要包含的头文件:<sys/types.h>,<sys ...

  4. 关于sed的应用

    公司让我做一个看一下在优化的程序和比原来的程序快多少,但是文件还在运行的服务器上,我需要把用到的文件复制到测试服务器上去.但是测试服务器上有的,目录不全,会导致scp出错.就发生了以下的故事. 首选我 ...

  5. <.net>委托初探

    最近在学<.net深入体验与实战精要>. 今天就来初步讲解下委托. 一句话:委托定义了方法类型,可以将方法当做另一个方法的参数进行传递.委托包涵的只是方法的地址,而不是数据.类似于c指针. ...

  6. CUICatalog: Invalid asset name supplied:

    [UIImage imageNamed:name];但是这个name却是空的,所以就报了这个错了. 解决方法,在项目中搜索UIImage imageNamed:,然后打印看看所谓的name是否为空.找 ...

  7. javascript操作DOM的方法与属性

    文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构. 将HTML代码分解为DOM节点层次图: ...

  8. 【7】使用css/js/html模板来实现一个注册、登录和管理的功能

    分支:auth static添加文件 css文件夹: app.css    自定义css样式[*] bootstrap.min.cs    bootstrap样式 compomemts文件夹: 插件用 ...

  9. 不要怂,就是GAN (生成式对抗网络) (二)

    前面我们了解了 GAN 的原理,下面我们就来用 TensorFlow 搭建 GAN(严格说来是 DCGAN,如无特别说明,本系列文章所说的 GAN 均指 DCGAN),如前面所说,GAN 分为有约束条 ...

  10. Xshell4连接Linux后 win快捷键锁屏

    今天在使用Xshell连接CentOS后 使用Vim编辑器编辑完后 习惯性的按了Ctrl+S 然后按什么都不起作用 只能重新连接 通过查资料得知 Ctrl + S 是Linux 锁屏的快捷键 要解除锁 ...