本文主要是将java的集合框架从多个角度进行了分类,然后分别进行概述.
本文只是概述,方便对集合框架有个整体的了解.
只有JDK中明确说明是属于集合框架的类或接口,才在本文探讨范围内.
基于JDK1.8_102.
JDK中明确指明属于集合框架的类如下图所示:
csdn博文中图片会被压缩,可以点此访问原图:http://i.imgur.com/JqIxTMO.jpg
只有JDK中明确说明是属于集合框架的类或接口,才出现在上图中,其它的,比如 HashTable
JDK有明确指出是属于Java Collection框架,但是它的子类 Properties
JDK并没有明确指明,Oralce关于集合框架的官方文档中也没有明确指明 Properties
是属于集合框架.虽然理论上 Properties
也应当是属于集合框架,但是既然官方没有明确说明,从严谨的角度,就不在纳入本文的说明范围.
从图中可以明显的看出来,JAVA的集合框架大体上分为两部分:Collection 和 Map,其中 Collection 又分为了 List、Queue、Set三大类,除此之外还有一些比较零散的如 Iterator、Comparator等功能性接口,也是集合框架的一部分.
但是需要注意的是,Map本质上不是集合,只是这些接口提供了集合视图的操作,可以当作集合来处理.
Collection接口主要由两大类组成,一类是继承自 java.util.Collection
的,另一类是继承自 java.util.Map
的.
其中继承自 java.util.Collection
(也包含 java.util.Collection
自身)的有:
java.util.Collection
Collection层次结构中的根接口.一个Collection代表一组Object,也就是所谓的Collection的元素(Elements).Collection中的元素可以有重复的也可以完全不重复,可以是有序的也可以是无序的,具体看实现类怎么去实现.需要注意的是,JDK不提供该接口的任何直接实现,而是去实现定义更为具体的子接口(也就是List、Set、Queue等).但是像包(bag)和多集合(multiset)应当直接实现此接口.
所有的Collection接口的间接实现类都应该提供两个”标准的”构造方法:一个是void的(无参的)用于创建空collection的构造方法,还有一个是参数类型为Collection的单参数构造方法,用于创建一个具有与其参数相同元素新的 collection.这样可以很方便的在不同类型的collection之间相互转换.虽然在Collection接口中没办法对这个”标准”以接口方法的形式进行约定(接TransferQueue口不能有构造函数),但是所有的直接或者间接的实现类都应当遵循这项约定.
java.util.List
继承自 java.util.Collection
,有序元素的集合,也被称为sequence,通常允许有重复元素.
java.util.Set
通常意义上的Set的抽象,继承自 java.util.Collection
,不允许有重复元素,可能是有序的,也可能是无序的.
java.util.Queue
在处理元素前用于保存元素的 collection.除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作.
java.util.Deque
双端队列,一个线性 collection,支持在两端插入和移除元素.继承自 java.util.Queue
.
java.util.SortedSet
自动排序的 Set.这些元素使用其自然顺序(参考Comparable接口的API说明)进行排序,或者根据通常在创建有序 set 时提供的 Comparator
进行排序.该 set 的迭代器将按元素升序遍历 set.
java.util.NavigableSet
扩展的 SortedSet,具有了为给定搜索目标报告最接近匹配项的导航方法.可以按升序或降序访问和遍历 NavigableSet.
java.util.concurrent.BlockingQueue
支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用.隶属于java.util.concurrent 包.
java.util.concurrent.TransferQueue
继承自BlockingQueue,它是这样一个队列:生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费.隶属于java.util.concurrent 包.
java.util.concurrent.BlockingDeque
支持两个附加操作的 Deque,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用.隶属于java.util.concurrent 包.
继承自 java.util.Map
(也包含 java.util.Map
自身)的有:
java.util.Map
键值对的集合.
java.util.SortedMap
自动排序的 Map.这些元素使用key的自然顺序(参考Comparable接口的API说明)进行排序,或者根据通常在创建有序 set 时提供的 Comparator
对key进行排序.
java.util.NavigableMap
扩展的 SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法.可以按key的升序或降序访问和遍历 NavigableMap.
java.util.ConcurrentMap
提供原子 putIfAbsent、remove、replace 方法的Map.隶属于java.util.concurrent 包.
接口 | Hash table实现 | Resizable array实现 | Tree实现 | Linked list实现 | Hash table + Linked list实现 |
---|---|---|---|---|---|
Set | HashSet | TreeSet | LinkedHashSet | ||
List | ArrayList | LinkedList | |||
Queue | |||||
Deque | ArrayDeque | LinkedList | |||
Map | HashMap | TreeMap | LinkedHashMap |
java.util.HashSet
Set 接口的Hash table实现,是Set接口最全面的实现.
java.util.TreeSet
NavigableSet 接口的红黑树实现.
java.util.LinkedHashSet
Set 接口的Hash table 结合 linked list 的实现.此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代.此实现与 HashSet 的不同之外在于,HashSet后者维护着一个运行于所有条目的双重链接列表.
java.util.TreeSet
基于 TreeMap 的 NavigableSet 实现.使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法.此实现为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销
java.util.ArrayList
List接口的可变数组实现(相当于非同步的Vector),是List接口最全面的实现.
java.util.ArrayDeque
Deque 接口的大小可变数组的实现.
java.util.LinkedList
List 接口的链接列表实现.在元素的插入和删除上,比ArrayList有更好的性能.同样也实现了 Deque 接口,相当于一个FIFO的队列.
java.util.PriorityQueue
一个基于优先级堆的无界优先级队列.优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法.优先级队列不允许使用 null 元素.依靠自然顺序的优先级队列还不允许插入不可比较的对象.
java.util.HashMap
Map接口的 Hash table 实现,相当于非同步的Hashtable.支持 null key和value.是Map接口最全面的实现.
java.util.TreeMap
NavigableMap 接口的红黑树实现.
java.util.LinkedHashMap
Map接口的 Hash table 结合 linked list 实现.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序).效率几乎和HashMap一样.
主要是对其它实现的功能性增强,一般仅通过static方法来调用.
java.util.Collections.unmodifiableInterface
返回指定collection的一个不可修改的视图,如果用户试图修改它,那么就会抛出一个 UnsupportedOperationException.
java.util.Collections.synchronizedInterface
根据指定的collection(通常是非同步的),返回一个同步的collection.只要是通过返回的这个collection来访问指定的collection,那么就能保证其线程安全.
java.util.Collections.checkedInterface
返回指定 collection 的一个动态的类型安全的视图,如果用户尝试添加一个错误类型的元素,那么就会抛出一个ClassCastException.
泛型是在编译期(静态)进行的类型检查,但是这种机制有可能会被忽视掉.动态的类型安全视图可以消除这种可能性.
用来将一种类型的collection适配为另外一种.
java.util.Collections.newSetFromMap(Map)
根据一个通用的Map实现,创建一个通用的Set实现.
java.util.Collections.asLifoQueue(Deque)
将Deque转换为后进先出(LIFO)的Queue.
Collection接口的高性能最小实现.
来自 java.util.Arrays
的:
asList
允许将一个数组转换成list.
来自 java.util.Collections
的:
emptySet, emptyList, emptyMap
返回一个不可变的空的set, list 或 map.
singleton, singletonList, singletonMap
返回一个不可变的只包含指定对象(或者是键值对)的set, list 或 map.
nCopies
返回一个包含指定对象n份copy的list.
比较老的集合类,出现的比Collection接口还早,在出现Collection接口后,才去实现的Collection接口.
java.util.Vector
List接口的同步可变数组实现.
java.util.Hashtable
Map接口的同步的hash table实现,不允许key和value为null.
java.util.WeakHashMap
以弱引用的key实现的基于哈希表的 Map.这样的话,当某个key在WeakHashMap外不再被引用时,就会及时的被回收. java.util.IdentityHashMap
Map 接口的基于hash table的Identity-based实现.IdentityHashMap有其特殊用途,比如序列化或者深度复制.IdentityHashMap在对它的key做比较时,是判断引用相等(==判断),而不是调用equals方法,这也是和HashMap的一大不同之处.java.util.concurrent.CopyOnWriteArrayList
List 接口的基于copy-on-write数组的实现.所有会引起list变化的操作(比如add, set, remove),都是通过创建数组的新的副本来实现的.不需要手动同步,甚至在迭代器迭代的过程中iterator也确保不会抛出ConcurrentModificationException.该实现比较适合去处理event-handler(不经常变化,但访问频繁并且可能比较费时)这样的列表.java.util.concurrent.CopyOnWriteArraySet
Set 接口的基于copy-on-write数组的实现.有点类似CopyOnWriteArrayList
.和大多数Set不同的是,add, remove,以及 contains方法的耗时会随着Set的大小增加而成比例的增大.适用于不能有重复的event-handler列表.java.util.EnumSet
依赖于bit vector的高性能的 Set 实现.EnumSet中所有键都必须来自单个枚举类型.java.util.EnumMap
依赖于数组的高性能的 Map 实现.EnumMap中所有键都必须来自单个枚举类型.这些实现都属于java.util.concurrent
包.
java.util.concurrent.ConcurrentLinkedQueue
一个无界的先进先出(FIFO)的基于linked nodes的队列.java.util.concurrent.LinkedBlockingQueue
一个可控边界的先进先出(FIFO)的基于linked nodes的队列.java.util.concurrent.ArrayBlockingQueue
一个有界的先进先出(FIFO)的基于数组的队列.java.util.concurrent.ArrayBlockingQueue
一个依赖于 priority heap 的无界阻塞队列.java.util.concurrent.DelayQueue
一个依赖于priority heap的time-based scheduling 队列.java.util.concurrent.SynchronousQueue
BlockingQueue接口的一个简单的会合机制的实现.java.util.concurrent.LinkedBlockingDeque
一个依赖于linked nodes可控边界的 FIFO 阻塞队列.java.util.concurrent.LinkedTransferQueue
一个依赖于linked nodes无界的TransferQueue.java.util.concurrent.ConcurrentHashMap
一个基于hash table的支持高并发的高性能的 ConcurrentMap 实现.java.util.concurrent.ConcurrentSkipListSet
NavigableSet接口的SkipList实现.java.util.concurrent.ConcurrentSkipListMap
ConcurrentNavigableMap接口的SkipList实现.collection接口的骨干实现.
java.util.AbstractCollection
Collection 接口的骨干实现,既不是set也不是list(类似”bag”或multiset).java.util.AbstractSet
Set 接口的骨干实现.java.util.AbstractList
List 接口的基于随机访问数据存储(比如数组)的骨干实现.java.util.AbstractSequentialList
List 接口的基于连续访问数据存储(比如LinkedList)的骨干实现.java.util.AbstractQueue
Queue 接口的骨干实现.java.util.AbstractMap
Map 接口的骨干实现.都是 java.util.Collections
提供的静态方法.
sort(List) - 使用混合排序算法对list进行排序,相比于高质量的快速排序,混合排序可以提供一个比较中庸的排序实现:它可以确保复杂度为O(n*log n)(不同于快速排序),同时也是稳定的排序(也不同于快速排序)–稳定是指对于相等的(equal)元素,排序后不会改变它们的顺序.
binarySearch(List, Object) - 使用二分检索算法,在一个排序过的list中查找指定的元素.
reverse(List) - 将list中元素的顺序进行反转.
shuffle(List) - 随机改变list中元素的顺序.
fill(List, Object) - 使用指定的值覆盖list中的每一个元素.
copy(List dest, List src) - 将原list的内容复制到目标list中.
min(Collection) - 返回集合中的最小元素.
max(Collection) - 返回集合中的最大元素.
rotate(List list, int distance) - 通过指定的距离进行旋转指定列表中的元素.
replaceAll(List list, Object oldVal, Object newVal) - 将所有的指定的元素替换成另外一个新的值.
indexOfSubList(List source, List target) - 返回source中第一个等于target的子list的索引.
lastIndexOfSubList(List source, List target) - 返回source中最后一个等于target的子list的索引.
swap(List, int, int) - 交换指定list中指定两个元素的位置.
frequency(Collection, Object) - 计算指定元素在collection中出现的次数.
disjoint(Collection, Collection) - 判断两个collection是否相交, 换句话说,它们是否包含相同的元素.
addAll(Collection
Iterators - 类似Enumeration接口,但是功能更强大.同时也是用来替代Enumeration接口的.
Iterator - 除了 Enumeration 接口的功能之外, 还允许用户从备份的collection中移除元素.
ListIterator - 针对list的Iterator. 除了Iterator 接口的功能之外, 还支持双向的迭代,元素替换,元素插入, 以及索引检索.
Comparable - 通知实现此接口的类进行自然排序. 自然排序可以用来对一个list进行排序,或者是维护有序的set或map的顺序. 为了实现此接口,很多类都进行了重写.
Comparator - 表示一种顺序关系, 可以用来对一个list进行排序,或者是维护有序的set或map的顺序.它可以覆盖某种类型的对象原有的自然排序 或者是对并没有实现Comparable接口的某种类型的对象进行排序.
java.lang.UnsupportedOperationException
当一个不支持的可选操作被调用时,由collection抛出该异常.
java.util.ConcurrentModificationException
如果在迭代的过程中,所依赖的collection发生了改变,那么将会由迭代器和列表迭代器抛出该异常.当列表发生了意料之外的改变时,列表的sublist views也会抛出该异常.
java.util.RandomAccess
一个标记接口,用来表明此List实现支持快速随机访问(通常是固定时间). 这可以让JDK的一些算法在访问这些list的时候,改变算法的行为,以便获取到更好的性能.
java.util.Arrays
包含了一系列的静态工具方法,包括但不限于: sort, search, compare, hash, copy, resize, convert to String, and fill arrays of primitives and objects.