java集合Collection、List、map、ConcurrentHashMap讲解

来源:互联网 发布:电子口岸数据分中心 编辑:程序博客网 时间:2024/05/17 12:46

1、java集合构成

2、Collection接口

      Collection是java最基本的接口,一个Collection代表一组Object。JDK不直接提供Collection的接口,而是提供继承自Collection的子接口 如List、Set

      有些Collection支持排序,有些不支持;有些可以允许元素相同,有些则不允许。

        不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

    Iterator it = collection.iterator(); // 获得一个迭代子

    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一个元素
    }
  由Collection接口派生的两个接口是List和Set。

     2.1 List接口

           List是有序的Collection,允许有相同元素

           实现List接口的常用类有LinkedList、ArrayList、Vector和Stack

      2.1.1 LinkedList类

                 LinkedList实现了List接口,允许null元素。LinkedList提供额外的get、remove、insert方法在LinkedList的首部和尾部,这些操作可以使LinkedList可被用作堆栈、队列或双向队列。

             无同步、多线程访问需要自己同步一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));

      2.1.2 ArrayList类

       ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。

     2.1.3 Vector类

        Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和 ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使                  用,另一个线程改变了 Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。

           2.1.3.1Stack 类

       Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈              是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

     2.1.4Set接口

  Set是一种不包含重复的元素的Collection,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。

  请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

3、Map接口

   Map没有继承Collection接口。一个Map中不能包含相同的key。

         Map.Entry 接口

         Map 的 entrySet() 方法返回一个实现Map.Entry 接口的对象集合。集合中每个对象都是底层 Map 中一个特定的键-值对。

         通过这个集合迭代,您可以获得每一条目的键或值并对值进行更改。但是,如果底层 Map 在Map.Entry 接口的setValue() 方法外部被修改,此          条目集就会变得无效,并导致迭代器行             为未定义。     

Map<Integer, String> phoneMap = phoneServiceComp.findMap(Constant.FLAG_TEL_ZHUZHAN, content);
for (Iterator it = phoneMap.entrySet().iterator(); it.hasNext(); ) {// ����MAP    Map.Entry<Integer, String> e = (Map.Entry<Integer, String>) it.next();    if (e.getKey().equals(70) || e.getKey().equals(100)) {

    3.1 Hashtable类

  Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
  put、get这两个基本操作的时间开销为常数。
       Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节        省空间但相应的查找时间将增大,这          会影响像get和put这样的操作。
       由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方 法。                     hashCode和equals方法继承自根类           Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相 同,即                 obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不       同,则它们的hashCode不一定不同,如 果两个不同对象的hashCode         相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈       希 表的操作。

   如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要        同时复写equals方法和hashCode方             法,而不要只写其中一个。
   Hashtable是同步的。

   3.2 HashMap类

   HashMap和Hashtable类似,不同之处在于HashMap是非同步的并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代           子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

   3.3 WeakHashMap类
  WeakHashMap是一种改进的HashMap,
它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

4、ConcurrentHashMap

    

     ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。

     从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个          HashTable中。

     在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中:


   ConcurrentHashMap中默认是把segments初始化为长度为16的数组。

   根据ConcurrentHashMap.segmentFor的算法,3、4对应的Segment都是segments[1],7对应的Segment是segments[12]。

   (1)Thread1和Thread2先后进入Segment.put方法时,Thread1会首先获取到锁,可以进入,而Thread2则会阻塞在锁上:

   (2)切换到Thread3,也走到Segment.put方法,因为7所存储的Segment和3、4不同,因此,不会阻塞在lock():

    ConcurrentHashMap的工作机制,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。



0 0
原创粉丝点击