博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TreeMap、HashMap、ConcurrentSkipListMap之性能比较
阅读量:6075 次
发布时间:2019-06-20

本文共 1681 字,大约阅读时间需要 5 分钟。

比较原生的 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

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个指针(甚至更少)。

Skip list的性质

(1) 由很多层结构组成,level是通过一定的概率随机产生的。

(2) 每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的进行排序,具体取决于使用的构造方法。
(3) 最底层(Level 1)的链表包含所有元素。
(4) 如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现。
(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

Ø  ConcurrentSkipListMap具有Skip list的性质 ,并且适用于大规模数据的并发访问。多个线程可以安全地并发执行插入、移除、更新和访问操作。与其他有锁机制的数据结构在巨大的压力下相比有优势。

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

hashMap线程不安全,而也实现Map接口的hashTable却是线程安全的。

转载地址:http://ljxgx.baihongyu.com/

你可能感兴趣的文章
Android:×××
查看>>
Linux基础(14)Linux的特殊权限
查看>>
求最大公约数
查看>>
一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)
查看>>
trigger AFTER SUSPEND for tablspace quota
查看>>
OGG运维优化脚本(十)-查询维护类--进程详细信息查询
查看>>
vim同时(取消)注释多行文本
查看>>
程序猿装B指南
查看>>
MHA的搭建
查看>>
LintCode 第一题fizz buzz
查看>>
5002.课件和视频下载--防火墙虚拟系统技术说明
查看>>
fragment中查看view的宽度以及单位px和dip换算
查看>>
第 5 章 网络 - 031 - none和host网络的适用场景
查看>>
第 5 章 Nova - 041 - Resize Instance 操作详解
查看>>
满满都是回忆:微软带你回顾XP时代的100个经典(转自远景论坛)
查看>>
起死回生:专治Linux各种“起不来”
查看>>
PPT制造精巧水晶收获组织机构图好看的ppt模板下载
查看>>
【零基础手把手教你学Python】02 与Python的第一次亲密接触——HelloWorld
查看>>
我的友情链接
查看>>
mysql数据库基础知识
查看>>