首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

JDK1.5之中的Map有关的类

2012-08-27 
JDK1.5之中的Map相关的类java5的java.util包提供了大量集合类。其中最常用的集合类有List、Set、Map等。这篇文

JDK1.5之中的Map相关的类

java5的java.util包提供了大量集合类。其中最常用的集合类有List、Set、Map等。这篇文章主要介绍其中的Map。

首先,来看下java.util包中Map相关的集合类的类图。

?

JDK1.5之中的Map有关的类

?

接口Map是整个类图的跟,Map往下又提供了两个接口:ConcurrentMap和SortedMap。ConcurrentMap是java5中新增的线程安全的Map接口;而SortedMap则是支持排序的Map接口。在下面这些具体的实现类中,常用的就属Hashtable、HashMap和TreeMap了。另外,java5新增了HashMap的并发版本ConcurrentHashMap。下面主要介绍下这几个类。

?

在开始之前,先介绍下Map是什么?

javadoc中对Map的解释如下:

?JDK1.5之中的Map有关的类JDK1.5之中的Map有关的类
    ?JDK1.5之中的Map有关的类JDK1.5之中的Map有关的类
      ?JDK1.5之中的Map有关的类JDK1.5之中的Map有关的类
        ?JDK1.5之中的Map有关的类JDK1.5之中的Map有关的类
          Iterator keys = map.keySet().iterator();while(keys.hasNext()){ map.get(keys.next());}

          ?

          在这里,有一个地方需要注意的是:得到的keySet和迭代器都是Map中元素的一个“视图”,而不是“副本” 。问题也就出现在这里,当一个线程正在迭代Map中的元素时,另一个线程可能正在修改其中的元素。此时,在迭代元素时就可能会抛出 ConcurrentModificationException异常。为了解决这个问题通常有两种方法,一是直接返回元素的副本,而不是视图。这个可以通过

          集合类的 toArray() 方法实现,但是创建副本的方式效率比之前有所降低,特别是在元素很多的情况下;另一种方法就是在迭代的时候锁住整个集合,这样的话效率就更低了。


          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线程可以使用原来老的数据,而写线程也可以并发的完成改变。

          ?

热点排行