Java Collections 框架

Collection(下称"对象集") 指一个能够表示一组对象的对象(比如数组)。Java 平台提供了一个 Collections 框架,它是一个统一的架构,用来表示和处理对象集,同时又对每一个具体的对象集做了很多实现上的算法优化。
 
Collections 框架的主要优点有:
  • 降低编程成本:这些数据结构和算法都已经摆在那里,你就不用自己实现了。
  • 提升性能:提供的数据结构和算法实现都是高性能的。每个接口内部都提供了多种可以互相替代的实现,程序可以通过替换实现来进行性能调优。
  • 提供了无关 API 间的内部交互:建立了一个通用的语义,给 API 传入和传出对象集。
  • 更容易学习 API:你不需要学习一些特别的对象集 API。
  • 更容易设计和实现 API:你不需要设计和实现一些特别的对象集 API.
  • 促进软件复用:框架提供了标准的接口和实现,这本身就是很好的软件复用。
 
Collections 框架由以下部分组成:
  • 对象集接口:表示不同的对象集类型,比如集合(set)、列表(list)、映射(map)等,这些接口形成了框架的基础。
  • 通用实现:对象集接口的基本实现。
  • 早期实现:一些像 Vector 和 Hashtable 这样在早期 java 版本中就提供的对象集实现,在当前版本也实现了对应的对象集接口。
  • 特别目的的实现:适用于特定场景的实现,这些实现带来了特别的性能体验,但也包含一些使用限制和特殊的行为表现。
  • 并发实现:为高并发用途而设计的实现。
  • 封装实现:对其他实现添加了额外的功能,比如说同步功能。
  • 传统实现:高性能的对象集“最小实现”。???
  • 抽象实现:为了方便定制实现,实现一部分对象集接口。
  • 算法:一组静态方法,提供用于对象集上的有用操作,比如列表的排序。
  • 数组工具:用于操作原始类型数据或是引用对象数组的工具函数。不严格地说,这也是 Collections 框架的一部分,这个特性是跟 Collections 框架同步发布的,底层也用了一些共同基础逻辑。
 
对象集接口
 
对象集接口主要分为两大类:java.util.Collection 和 java.util.Map
java.util.Collection 的子接口包括:
  • java.util.Set 
      普通集合接口
  • java.util.SortedSet 
      有序集合接口,集合中的元素按照给定的顺序或自然顺序排序,该接口额外提供一些类似获取某个范围内的子集合这样的方法。
  • java.util.NavigableSet 
      导航集合是在有序集合的基础上加上了一些导航访问方法。
  • java.util.Queue 
      是一个先进先出的队列
  • java.util.concurrent.BlockingQueue 
      在普通队列的基础上提供了"延迟满足"功能,具体是指从队列中获取元素时可以一直等待到队列有值,或者是往队列中放元素时可以一直等待直到队列有空间可用。
      BlockingQueue 处理生产者-消费者模式的多线程模型是一把好手。
  • java.util.concurrent.TransferQueue 
      在 BlockingQueue 的基础上增加了对消息递送的保证,比如 transfer 方法有消费者接收到这个消息才返回。
  • java.util.Deque 
      发音是“deck”,是一个双端队列,对队列头尾都可以操作。
  • java.util.concurrent.BlockingDeque
      是在 Deque 的基础上增加了“延迟满足”功能。
 
java.util.Map 的子接口包括:
  • java.util.SortedMap 
      在普通 Map 的基础上提供对 key 的有序存储,可以提供最小的 key,最大的 key,某个范围内的 key 的子 Map 这样的方法。
  • java.util.NavigableMap 
      在 SortedMap 的基础上进一步提供一些导航访问功能。
  • java.util.concurrent.ConcurrentMap 
      是线程安全的 Map
      在 Map 基础上提供了一些像 putIfAbsent 这样的原子方法
  • java.util.concurrent.ConcurrentNavigableMap
      线程安全的 NavigableMap
 
上述接口中有很多方法被标注为可选的(optional),这意味着允许具体的实现类不实现这些方法,被调用到的时候直接抛出一个 UnsupportedOperationException 异常。
 
通用实现
下面这个表格总结了 Collections 框架中的通用实现类。
接口
HashTable
Resiable Array
Balanced Tree
Linked List
Hash Table
+ LinkedList
Set
HashSet
 
TreeSet
 
LinkedHashSet
List
 
ArrayList
 
LinkedList
 
Deque
 
ArrayDeque
 
LinkedList
 
Map
HashMap
 
TreeMap
 
LinkedHashMap
上述的通用实现类都实现了所有的可选操作,对他们装填的元素也没有任何限制。值得注意的是它们都不是线程安全的,另外所有新的实现都有 fail-fast 迭代器,就是在迭代的时候如果检测到容器结构被修改了,就抛出 ConcurrentModificationException 异常。
 
支持并发的对象集
在并发程序中使用对象集需要非常小心,好在 Collections 框架提供了多种对并发访问友好的 API,这些类型比同步的封装类好用多了。
 
支持并发的接口如下:
  • BlockingQueue 
  • TransferQueue 
  • BlockingDeque 
  • ConcurrentMap 
  • ConcurrentNavigableMap
 
对应的实现类如下:
  • LinkedBlockingQueue 
  • ArrayBlockingQueue 
  • PriorityBlockingQueue 
  • DelayQueue 
  • SynchronousQueue 
  • LinkedBlockingDeque 
  • LinkedTransferQueue 
  • CopyOnWriteArrayList 
  • CopyOnWriteArraySet 
  • ConcurrentSkipListSet 
  • ConcurrentHashMap 
  • ConcurrentSkipListMap
 
设计哲学
主要的设计目标是产生一个小而精的对象集 API。
为了做到接口数量足够小,对于像可变性、可修改性这样的不同细节,不是通过多个接口来区分,而是通过接口的可选方法来实现。
为了让接口内部的方法足够少,这些方法必须满足下面的某个条件:
  • 真的是一个基础操作
  • 一些特别高效的实现,覆写了该方法后可以达到显著的性能提升

 
 
 
 

猜你喜欢

转载自bibithink.iteye.com/blog/2267711