介绍
Java平台包括一个collections框架。集合就是代表一组对象(例如经典的Vector类)。集合框架是用于表示和操作集合的统一体系结构,使集合可以独立于实现细节操作。
集合框架的主要优点是:
- 通过提供数据结构和算法来减少编程工作,因此您不必自己编写它们。
- 通过提供数据结构和算法的高性能实现来提高性能。因为每个接口的各种实现都是可互换的,所以可以通过切换实现来调整程序。
- 通过建立公共语言来回传递集合,从而在不相关的API之间提供互操作性。
- 通过要求您学习多个特定集合API,来减少了学习全部API所需的工作量。
- 通常不需要您生成特定集合API,减少了设计和实现API所需的工作量。
- 通过为集合和用于操作集合的算法提供标准接口,促进软件重用。
集合框架包括:
- 集合接口。表示不同类型的集合,例如sets、lists和maps。这些接口构成了框架的基础。
- 通用实现。集合接口的主要实现。
- 旧版实现。改造了早期版本的Vector和Hashtable的集合类,以实现集合接口。
- 特殊用途的实现。设计用于特殊情况的实现。这些实现显示非标准的性能特征,使用限制或行为。
- 并发实现。专为高度并发使用而设计的实现。
- 包装器实现。向其他实现中添加功能,例如同步。
- 便利的实现。集合接口的高性能“微型实现”。
- 抽象实现。集合接口的部分实现可简化自定义实现。
- 算法。对集合执行有用功能的静态方法,例如对list进行排序。
- 基础设施。为集合接口提供基本支持的接口。
- 数组实用程序。原始类型和引用对象数组的实用程序函数。严格来说,它不是集合框架的一部分,而是与集合框架同时添加到Java平台,并且依赖于某些相同的基础结构。
集合接口
集合接口被分为两组。
最基本的接口java.util.Collection具有以下子代:
- java.util.Set
- java.util.SortedSet
- java.util.NavigableSet
- java.util.Queue
- java.util.concurrent.BlockingQueue
- java.util.concurrent.TransferQueue
- java.util.Deque
- java.util.concurrent.BlockingDeque
更详细的看下图
其他集合接口基于java.util.Map,而不是真实的集合。但是,这些接口包含 集合视图操作,使它们可以作为集合进行操作。
Map具有以下子代:
- java.util.SortedMap
- java.util.NavigableMap
- java.util.concurrent.ConcurrentMap
- java.util.concurrent.ConcurrentNavigableMap
更详细的看下图
集合接口中的许多修改方法都标记为optional。允许实现不执行这些操作中的一个或多个,如果尝试执行,则抛出运行时异常(UnsupportedOperationException)。每个实现的文档必须指定支持哪些可选操作。
引入了一些术语以帮助该规范:
- 不支持修改操作(例如添加,删除和清除)的称为不可修改的集合。反之是可修改的集合。
- Collection对象中看不到任何更改的 集合称为 不可变的集合。反之是可变的集合。
- 即使元素可以更改,也要保证其大小保持不变的列表被称为 固定长度列表。反之是可变长度列表。
- 支持快速(通常为固定时间)索引元素访问的列表称为随机访问列表(通常为散列表)。 不支持快速索引元素访问的列表称为顺序访问列表(通常为线性表)。 RandomAccess标记的接口使列表能够支持它们支持随机访问。 这使得通用算法在应用于随机或顺序访问列表时,可以提供良好的性能。
某些实现限制了可以存储哪些类型(或者在Maps的情况下 ,键和值)。可能出现的限制条件:
- 属于特定类型。
- 不为空。
- 服从一些任意谓词。
尝试添加违反实现限制的元素会导致运行时异常,通常是 ClassCastException,IllegalArgumentException或NullPointerException。尝试删除或测试是否存在违反实现限制的元素会导致异常。
集合实现
实现集合接口的类通常以< 实现类型 > < 接口 > 的形式来命名。下表总结了通用实现:
接口 | 哈希表 | 可变数组 | B 树 | 链表 | 哈希表+链表 |
---|---|---|---|---|---|
Set | HashSet | - | TreeSet | - | LinkedHashSet |
List | - | ArrayList | - | LinkedList | - |
Deque | - | ArrayDeque | - | LinkedList | - |
Map | HashMap | - | TreeMap | - | LinkedHashMap |
通用实现支持收集接口中的所有 可选操作,并且对它们可能包含的元素没有限制。它们是不同步的,但是Collections类包含称为同步包装器的静态工厂,可用于将同步添加到许多未同步的集合中。所有新的实现都有故障快速迭代器,该迭代器检测无效的并发修改,并且快速而干净地失败(而不是行为异常)。
本类AbstractCollection,AbstractSet, AbstractList中,AbstractSequentialList和 AbstractMap类提供核心集合接口的基本实现,以最小化来实现他们的工作所需。这些类的API文档精确地描述了每种方法的实现方式,因此,在特定实现的基本操作得以执行的情况下,实现者知道必须重写哪些方法。
并发集合
使用来自多个线程的集合的应用程序必须经过仔细编程。通常,这称为并发编程。Java平台包括对并发编程的广泛支持。有关详细信息,请参见Java并发实用程序。
集合是如此频繁地使用,以至于各种并发友好接口和集合的实现都包含在API中。这些类型超出了前面讨论的同步包装程序的范围,可提供并发编程中经常需要的功能。
这些并发感知接口可用:
可以使用以下并发感知实现类。有关这些实现的正确用法,请参阅API文档。
- LinkedBlockingQueue
- ArrayBlockingQueue
- PriorityBlockingQueue
- DelayQueue
- SynchronousQueue
- LinkedBlockingDeque
- LinkedTransferQueue
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- ConcurrentSkipListSet
- ConcurrentHashMap
- ConcurrentSkipListMap
设计目标
主要设计目标是生产一种尺寸更小且更重要的是“概念重量”的API。至关重要的是,新功能与当前的Java程序员似乎并没有太大区别。它必须增加现有设施,而不是更换它们。同时,新的API必须足够强大才能提供先前描述的所有优点。
为了使核心接口的数量保持较小,接口不会尝试捕获诸如可变性,可修改性和可缩放性之类的细微差别。相反,核心接口中的某些调用是可选的,使实现可以引发UnsupportedOperationException来指示它们不支持指定的可选操作。集合实现者必须清楚地记录实现支持哪些可选操作。
为了使每个核心接口中的方法数量保持较小,接口仅在满足以下任一条件时才包含方法:
这是真正的基本操作:可以合理定义其他基本操作的基本操作,
有一个令人信服的性能原因,为什么重要的实现要覆盖它。
至关重要的是,所有合理的馆藏表现形式必须能够良好地互操作。这包括数组,如果不更改语言就不能直接实现Collection接口。因此,该框架包括以下方法:使集合能够移动到数组中,将数组视为集合,将地图视为集合。
参考来源:
https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html
注:Google翻译,稍作修改。尚有词不达意之处,日后在慢慢修改啦。
本文由 Administrator 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站部分文章采集自互联网,因某些原因未注明出处,如有侵权,请留言告知。