java Map集合对比分析
2019-05-22 06:29:45来源:博客园 阅读 ()
1、Map:Map是所有map集合的顶级父接口,用于key/value形式的键值对,其中每一个key都映射到一个值,key不能重复。
2、TreeMap:该map将存储的键值对进行默认排序,并且还能够指定排序的比较器,是线程不安全的。TreeMap不允许键值为null。
// 指定比较器进行排序 Map map = new TreeMap(new Comparator(){ Public int compare(obj1, obj2){...} });
3、HashMap:这也是我们平时开发中最常用的map,底层实现为数组+链表,它根据键key的HashCode值存储数据,可以使用get(key)来获取键对应的值,是线程不安全的。HashMap允许存在一条键为null的记录。在数据量小的时候,HashMap是以链表的模式存储数据;当数据量变大后,为了进行快速查找,会将这个链表变为红黑树来进行保存,使用key的哈希值来进行查找。
4、Hashtable:与HashMap类似,不同的是,Hashtable是线程安全的,在进行插入是会比HashMap慢,并且key和value的值均不允许为null。对个线程同时访问Hashtable对象时,第一个线程获取锁后,会引发其他线程进行等待,知道第一个线程释放掉锁。
5、LinkedHashMap:该map保证了对面在插入值得顺序,在查询遍历的时候会比HashMap慢,是线程不安全的。允许key和value均为空。
6、ConcurrentHashMap:该map对象时线程安全的,与Hashtable不同的是,ConcurrentHashMap采用了分段锁技术,没有同Hashtable一样锁住全部数据,而是锁定线程访问的那一段数据。对个线程在访问不同段数据时就不会存在等待。
ConcurrentHashMap的主干是Segment数组。没有Segment就相当于一个小的HashTable,知道不修改访问同一个Segment上的数据就不会存在并发问题。
(盗用大佬的一张图片)
Segment是一种可重入锁,继承ReentranLock类。下面简单介绍一下ReentranLock与synchronized的区别:
- Synchronized是一个同步锁。当一个线程A访问synchronized修饰的代码块时,线程A就会获取该代码块的锁,如果这时存在其他线程范围该代码块时,将会阻塞,但是不影响这些线程访问其他非同步代码块。
- ReentranLock是可重入锁。由构造方法可知,该锁支持两种锁模式,公平锁和非公平锁。默认是非公平的。
公平锁:当线程A获取访问该对象,获取到锁后,此时内部存在一个计数器num+1,其他线程想访问该对象,就会进行排队等待(等待队列最前一个线程处于待唤醒状态),直到线程A释放锁(num = 0),此时会唤醒处于待唤醒状态的线程进行获取锁的操作,一直循环。如果线程A再次尝试获取该对象锁是,会检查该对象锁释放已经被占用,如果被占用,会做一次是否为当前线程占用锁的判断,如果是内部计数器num+1,并且不需要进入等待队列,而是直接回去当前锁。
非公平锁:当线程A在释放锁后,等待对象的线程会进行资源竞争,竞争成功的线程将获取该锁,其他线程继续睡眠。
公平锁是严格的以FIFO的方式进行锁的竞争,但是非公平锁是无序的锁竞争,刚释放锁的线程很大程度上能比较快的获取到锁,队列中的线程只能等待,所以非公平锁可能会有“饥饿”的问题。但是重复的锁获取能减小线程之间的切换,而公平锁则是严格的线程切换,这样对操作系统的影响是比较大的,所以非公平锁的吞吐量是大于公平锁的,这也是为什么JDK将非公平锁作为默认的实现。
对于Map的遍历,建议使用entrySet迭代器方式,在进行大量级数据时,效率会高很多。
以上都是个人学习总计,欢迎各位大佬进行评阅
原文链接:https://www.cnblogs.com/www-123456/p/10890855.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:存储管理
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash