实现是用于存储集合的数据对象,它实现了接口部分中描述的接口,本节描述了如下几种实现:html
java.util.concurrent
包的一部分。通用实现总结在下表中。java
接口 | 哈希表实现 | 可调整大小的数组实现 | 树实现 | 链表实现 | 哈希表+链表实现 |
---|---|---|---|---|---|
Set | HashSet | TreeSet | LinkedHashSet | ||
List | ArrayList | LinkedList | |||
Queue | |||||
Deque | ArrayDeque | LinkedList | |||
Map | HashMap | TreeMap | LinkedHashMap |
从表中能够看到,Java集合框架提供了Set、List和Map接口的几种通用实现。在每种状况下,其余全部条件都相同状况下,一个实现(HashSet、ArrayList和HashMap)显然是用于大多数应用程序的一个实现。请注意,SortedSet和SortedMap接口在表中没有列出,每一个接口都有一个实现(TreeSet和TreeMap),并在Set
和Map
行中列出。有两种通用的Queue
实现 — LinkedList(它也是List
实现)和PriorityQueue(表中省略)。这两种实现提供了很是不一样的语义:LinkedList
提供FIFO语义,而PriorityQueue
根据其值对元素进行排序。程序员
每一个通用实现都提供其接口中包含的全部可选操做,所有容许null
元素、键和值,都不是同步的(线程安全的),它们都具备快速失败的迭代器,该迭代器可在迭代过程当中检测到非法的并发修改,而且能够快速干净地失败,而不会在将来的不肯定时间冒着任意、不肯定的行为的风险。所有都是Serializable
,而且都支持公共clone
方法。编程
这些实现不一样步的事实表明了与过去的突破:遗留集合Vector
和Hashtable
已同步,之因此采用本方法,是由于在同步没有好处的状况下常用集合。这些用途包括单线程使用、只读使用和做为实现自身同步的较大数据对象的一部分使用,一般,最好的API设计作法是不要让用户为不使用的功能付费,此外,在某些状况下,没必要要的同步可能致使死锁。segmentfault
若是须要线程安全的集合,则在“包装实现”部分中介绍的同步包装器容许将任何集合转换为同步集合。所以,对于通用实现来讲,同步是可选的,而对于遗留实现来讲,它是强制性的。此外,java.util.concurrent
包提供了BlockingQueue
接口(扩展Queue
)和ConcurrentMap
接口(扩展Map
)的并发实现,这些实现比单纯的同步实现提供更高的并发性。api
一般,你应该考虑接口,而不是实现,这就是为何本节中没有编程示例的缘由,在大多数状况下,实现的选择仅影响性能。首选样式,如“接口”部分所述,是在建立集合时选择一种实现,并当即将新集合分配给相应接口类型的变量(或将集合传递给须要接口类型参数的方法)。这样,程序就不会依赖于给定实现中添加的任何方法,从而使程序员在有性能问题或行为细节保证的任什么时候候均可以自由更改实现。数组
实现是用于存储集合的数据对象,它们实现了接口课程中描述的接口。安全
Java集合框架提供了几个核心接口的通用实现:并发
Set
接口,HashSet
是最经常使用的实现。List
接口,ArrayList
是最经常使用的实现。Map
接口,HashMap
是最经常使用的实现。Queue
接口,LinkedList
是最经常使用的实现。Deque
接口,ArrayDeque
是最经常使用的实现。每一个通用实现都提供其接口中包含的全部可选操做。oracle
Java集合框架还为须要非标准性能、使用限制或其余异常行为的状况提供了几种特殊用途的实现。
java.util.concurrent
包包含几个集合实现,这些实现是线程安全的,但不受单个排除锁的约束。
Collections
类(与Collection
接口相对)提供了对集合进行操做或返回集合的静态方法,这些方法称为包装实现。
最后,有几种便利的实现,当你不须要通用实现时,它们的效率可能会比通用实现高,可经过静态工厂方法提供便捷实现。