Collection

Collection - DaySpring - DaySpring的博客
Map接口:
    |
    + -- WeakHashMap: 以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条
    |      目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终
    |      止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。非同步
    |
    + -- TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的
    |    构造方法。非同步
    |
    + -- HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了       
    |        非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺    
    |       序恒久不变。非同步
Collection - DaySpring - DaySpring 
    |
    +-- SortedMap: 进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有
         序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回
         )进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应映
         射)。
 
Collection接口:
    |
    + -- Set接口:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并
    |      |     且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。
    |      |
    |      + -- HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;
    |      |    特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,非同步
    |      |
    |      + -- LinkedHashSet:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在
    |      |    于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set
    |      |    中 的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。非同步。 
    |      |
    |      + -- TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时
    |           提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现为基本操作(add、remove 和 contains)
    |           提供受保证的 log(n) 时间开销。非同步
    |
    + -- List接口:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户
           |      可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
           |
           + -- ArrayList:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。
           |    除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 
           |    Vector 类,除了此类是不同步的。)每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数
           |    组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增
           |    长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。非同步
           |
           + -- LinkedList:List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实
           |    现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方
           |    法。这些操作允许将链接列表用作堆栈、队列或双端队列。提供先进先出队列操作(FIFO)。非同步
           |
           + -- Vector:Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是
                ,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。同步

 

Java集合容器总结:
按数据结构主要有以下几类:
  •  1,内置容器:数组
  •  2,list容器:Vetor,Stack,ArrayList,LinkedList,
  •  CopyOnWriteArrayList(1.5),AttributeList(1.5),RoleList(1.5),RoleUnresolvedList(1.5),
  •  ConcurrentLinkedQueue(1.5),ArrayBlockingQueue(1.5),LinkedBlockingQueue(1.5),
  •  PriorityQueue(1.5),PriorityBlockingQueue(1.5),SynchronousQueue(1.5)
  •  3,set容器:HashSet(1.2),LinkedHashSet(1.4),TreeSet(1.2),
  •  CopyOnWriteArraySet(1.5),EnumSet(1.5),JobStateReasons。
  •  4,map容器:Hashtable,HashMap(1.2),TreeMap(1.2),LinkedHashMap(1.4),WeakHashMap(1.2),
  •  IdentityHashMap(1.4),ConcurrentMap(1.5),concurrentHashMap(1.5)。
  • Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。
  • List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
  • Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。
按新旧主要有以下几类:
  • Java1.2前的容器:Vector,Stack,Hashtable。
  • Java1.2的容器:HashSet,TreeSet,HashMap,TreeMap,WeakHashMap
  • Java1.4的容器:LinkedHashSet,LinkedHashMap,IdentityHashMap,ConcurrentMap,concurrentHashMap
  • java1.5新增:CopyOnWriteArrayList,AttributeList,RoleList,RoleUnresolvedList,
  •  ConcurrentLinkedQueue,ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue
  •  ArrayBlockingQueue,CopyOnWriteArraySet,EnumSet,
  • 未知:JobStateReasons
按线程安全主要有以下几类:
线程安全
一,使用锁:
完全不支持并发:
  • list容器:Vetor,Stack,CopyOnWriteArrayList,ArrayBlockingQueue,
  • LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue
  • set容器:CopyOnWriteArraySet
  • map容器:Hashtable
部分支持并发:
  • list容器:无
  • set容器:无
  • map容器:concurrentHashMap
使用非阻塞算法:
  • list容器:ConcurrentLinkedQueue
  • set容器:无
  • map容器:无
二,非线程安全:
  • list容器:ArrayList,LinkedList,AttributeList,RoleList,RoleUnresolvedList,PriorityQueue
  • set容器:HashSet,TreeSet,LinkedHashSet,EnumSet
  • map容器:HashMap,TreeMap,LinkedHashMap,WeakHashMap,IdentityHashMap,EnumMap
按遍历安全主要有以下几类:
一,遍历安全:
可并发遍历:
  • list容器:CopyOnWriteArrayList,ConcurrentLinkedQueue
  • set容器:CopyOnWriteArraySet,EnumSet,EnumMap
  • map容器:无
不可并发遍历:
  • list容器:Vetor,Stack,Hashtable,ArrayBlockingQueue,
  • LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue
  • set容器:无
  • map容器:Hashtable,concurrentHashMap
注意1:concurrentHashMap迭代器它们不会抛出ConcurrentModificationException。不过,迭代器被设计成每次仅由一个线程使用。 
二,遍历不安全:
  • 会抛异常ConcurrentModificationException:
  • list容器:ArrayList,LinkedList,AttributeList,RoleList,RoleUnresolvedList
  • set容器:HashSet,TreeSet,TreeSet,LinkedHashSet
  • map容器:HashMap,TreeMap,LinkedHashMap,WeakHashMap,IdentityHashMap
注意1:返回的迭代器是弱一致 的:它们不会抛出 ConcurrentModificationException,
也不一定显示在迭代进行时发生的任何映射修改的效果的容器有:
EnumSet,EnumMap
按遍历是否有序性分类
存储数据有序:
  • list容器: ConcurrentLinkedQueue(1.5),ArrayBlockingQueue(1.5),LinkedBlockingQueue(1.5),
  • SynchronousQueue(1.5)
  • set容器:TreeSet(1.2).(他们实现了set接口),
  • CopyOnWriteArraySet(1.5),EnumSet(1.5),JobStateReasons。
  • map容器:TreeMap(1.2),LinkedHashMap(1.4) 。
一定规则下存储数据有序:
  • list容器:Stack,Vetor,ArrayList,LinkedList,CopyOnWriteArrayList(1.5),AttributeList(1.5),RoleList(1.5),RoleUnresolvedList(1.5)
  • set容器:无
  • map容器:无
遍历无序但移除有序:
  • list容器:PriorityQueue(1.5),PriorityBlockingQueue(1.5)
  • set容器:无
  • map容器:无
无论如何都无序:
  • list容器:无
  • set容器:HashSet(1.2),LinkedHashSet(1.4)
  • map容器:Hashtable,HashMap(1.2),WeakHashMap(1.2),IdentityHashMap(1.4),
  • ConcurrentMap(1.5),concurrentHashMap(1.5)
可以按自然顺序(参见 Comparable)或比较器进行排序的有:
  • list容器:PriorityQueue(1.5),PriorityBlockingQueue
  • set容器:TreeSet(1.2)
  • map容器:TreeMap(1.2)
 
实现了RandomAccess接口的有:
  • ArrayList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList, StackVector
  • RandomAccess接口是List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。
  • 在对List特别的遍历算法中,要尽量来判断是属于 RandomAccess(如ArrayList)还是SequenceAccess(如LinkedList),
  • 因为适合RandomAccess List的遍历算法,用在SequenceAccess List上就差别很大,
  • 即对于实现了RandomAccess接口的类实例而言,此循环
  • for (int i=0, i<list.size(); i++)   list.get(i);
  • 的运行速度要快于以下循环:
  • for (Iterator i=list.iterator(); i.hasNext(); )    i.next();

posted on 2018-08-29 15:08  xiaowater  阅读(131)  评论(0)    收藏  举报

导航