HashMap,HashTable,synchronizedMap,ConcurrentHashMap,TreeMap,IdentityHashMap的比较分析
2015-08-21 16:25
295 查看
1. Map接口简介
与Collection,Set,List这些单值操作接口不同的是,Map接口每次操作的是一对对象,即二元偶对象,Map接口中的每个元素都使用“key-value”的形式存在集合中。Map接口的定义入下:[code]public interface Map<K,V>
2.HashMap和Hashtable
Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。 当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。而在Hashtable中,无论是key还是value都不能为null 。
这两个类最大的不同在于:
(1)Hashtable是线程安全的,它的方法是同步了的,可以直接用在多线程环境中。
(2)而HashMap则不是线程安全的。在多线程环境中,需要手动实现同步机制。
因此,在Collections类中提供了一个方法返回一个同步版本的HashMap用于多线程的环境:
Java代码
[code]public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { return new SynchronizedMap<K,V>(m); }
该方法返回的是一个SynchronizedMap 的实例。
SynchronizedMap类是定义在Collections中的一个静态内部类。
它实现了Map接口,并对其中的每一个方法实现,通过synchronized 关键字进行了同步控制。
3.ConcurrentHashMap
java5中新增了ConcurrentMap接口和它的一个实现类ConcurrentHashMap。ConcurrentHashMap提供了和Hashtable以及SynchronizedMap中所不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。ConcurrentHashMap默认将hash表分为16个桶,诸如get,put,remove等常用操作只锁当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。上面说到的16个线程指的是写线程,而读操作大部分时候都不需要用到锁。只有在size等操作时才需要锁住整个hash表。
在迭代方面,ConcurrentHashMap使用了一种不同的迭代方式。在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出ConcurrentModificationException,取而代之的是在改变时new新的数据从而不影响原有的数据 ,iterator完成后再将头指针替换为新的数据 ,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变。
4. TreeMap
TreeMap主要特点是可以按Key排序5. IdentityHashMap
key值可以重复的Map相关文章推荐
- android framework MediaScanner等sd卡u盘扫描流程简要跟踪分析
- 15个必须知道的 Chrome 开发技巧
- Centos下pure-ftpd安装配置详解
- Project_2007关键
- ApsCMS AspCms_SettingFun.asp、AspCms-qqkfFun.asp、AspCms_Slide.asp、AspCms_StyleFun.asp、login.asp、AspCms_CommonFun.asp Vul
- 编写高质量代码改善C#程序的157个建议——建议107:区分静态类和单例
- Spring dependency checking with @Required Annotation
- 实现单例模式C#版本
- IE访问Oracle EBS打不开Form的问题
- 帝国的征程——一个国家如何获得五大流氓的地位
- Android 4.4 后透明状态栏和导航栏效果实现(学习总结)
- 黑马程序员--IO流
- Android studio加载 Android design support library 22.2.1
- SQL server 2008 数据库企业版安装教程图解
- 背包之01背包、完全背包、多重背包详解
- Theme.AppCompat.Light在高版本问题的解决方法
- 如何下载NBA球员投篮信息
- Java添加注册表协议
- 【转】笔试常考:C语言字节对齐
- solr5.2.1的在tomcat下的安装(Linux和Windows都可以)