Collection
Collection接口是Java中集合继承关系中的根接口,一个集合表示一组元素。
List
List接口表示有序集合,使用这个接口可以将元素插入到集合指定的位置,也可以通过索引来查找元素。
在List接口的实现类中,Vector和ArrayList比较相似,它们内部的实现都是通过可变数组来实现的,两者的区别为Vector是线程安全的,而ArrayList是非线程安全的。
Queue
Queue接口是为优先处理元素而设计的,除了Collection接口中提供的操作,Queue接口还提供了插入元素,取出元素,检查元素的操作。这些操作在操作失败时,会出现两种情况,第一种是抛出异常,第二种是返回false或者null,这个是根据具体情况而定的。对于插入操作,第二种情况主要是为了那些对容量限制的实现而设计的,对于大部分实现,插入操作是不会失败的。线是对Queue方法的总结。
Queue中的元素一般都是FIFO(First-in-first-out),除了优先队列(队列中元素会根据提供的比较算法或元素的自然排序对元素进行排序)以及stack(last-in-first-out)。无论使用了什么排序方法,Queue中头元素(head)都会因为调用remove()或poll()方法而删除。在FIFO队列中,新元素都插入到队列的尾部(tail)。
方法作用 | 操作成功返回 | 在队列没有空间时 | 在队列为空时 | |
插入元素 | add(e) | true | 抛出IllegalStateException异常 | |
offer(e) | true | false | ||
取出并删除头元素 | remove() | 返回头元素 | 抛出NoSuchElementException | |
poll() | 返回头元素 | 返回null | ||
取出但不删除头元素 | element() | 抛出NoSuchElementException | ||
peek() | 返回null |
Deque
Deque是一个支持在两端添加和删除元素的线性集合。Deque是“Double End Queue”的缩写。它既支持限制容量的集合,也支持不限制容量的集合。跟Queue一样,Deque也提供了插入元素、删除元素、校验元素的方法,这些方法在操作失败时,有抛出异常和返回null或false两种形式,其中后者是为了有限集合而设计的。
操作 | 在队列没有空间时 | 当队列为空时 | |
插入元素 | addFirst(E e) push(E e) | 抛出IllegalStateException | |
offerFirst(E e) | 返回false | ||
addLast(E e) add(E e) | 抛出IllegalStateException | ||
offerLast(E e) offer(E e) | 返回false | ||
获取并删除删除元素 | removeFirst() remove() pop() | 抛出NoSuchElementException | |
pollFirst() poll() | 返回null | ||
removeLast() | 抛出NoSuchElementException | ||
pollLast() | 返回null | ||
获取但不删除元素 | getFirst() element() | 抛出NoSuchElementException | |
peekFirst() peek() | 返回null | ||
getLast() | 抛出NoSuchElementException | ||
peekLast() | 返回null |
可以总结出offer、poll、peek都是不会抛出异常的。
在JDK中实现了Deque的有ArrayDeque、LinkedList
Set
表示不包含相同元素的集合,最多只包含一个null。这个接口表示的集合没有对插入元素进行排序,也没有记住元素的插入顺序功能。在它的实现类中HashSet是比较典型的。HashSet的实现是通过HashMap来完成的。
SortedSet
在Set的基础上,提供了对元素排序的功能。因为要进行排序,就需要对元素进行比较,因此每个元素都必须实现Comparable接口或者被指定的comparator所接受。
SortedSet接口中的方法
comparator() | 返回集合中使用的对元素进行排序的比较器,如果集合中元素的排序是用的元素自带的,则返回null |
subSet(E fromElement, E toElement) | 返回Set的部分视图,其元素范围从fromElement(包括)到toElement(不包括),如果fromElement跟toElement相等,则返回一个空集合。返回的集合由原先的集合来支持,因此对原先集合进行修改,会影响返回集合,反之亦然。 |
SortedSet<E> headSet(E toElement) | 返回Set中的一部分,这部分小于toElement。返回的集合由原先的集合来支持,因此对原先集合进行修改,会影响返回集合,反之亦然。 |
SortedSet<E> tailSet(E fromElement) | 返回Set中的一部分,这部分大于fromElement。返回的集合由原先的集合来支持,因此对原先集合进行修改,会影响返回集合,反之亦然。 |
E first() | 返回集合中最小的元素 |
E last() | 返回集合中最大的元素 |
NavigableSet
这个接口在SortedSet基础上增加了一些对指定元素进行导航的一些API
E lower(E e) | 返回比元素e小的最大的元素,如果没有这样的元素,则返回null |
E floor(E e) | 返回比元素e小或者等于元素e的最大的元素,如果没有这样的元素,则返回null |
E ceiling(E e) | 返回比元素e大或者等于元素e的最小的元素,如果没有这样的元素,则返回null |
E higher(E e) | 返回比元素e大的最小的元素,如果没有这样的元素,则返回null |
E pollFirst() | 获取并删除集合中第一个(最小的)元素,如果集合为空,则返回null |
E pollLast() | 获取并删除集合中最后一个(最大的)元素,如果集合为空,则返回null |
NavigableSet<E> descendingSet() | 返回一个对集合进行降序排列的集合,原先结合中的修改会影响倒序排列的集合,反之亦然 |
Iterator<E> descendingIterator() | 以降序的形式返回集合的迭代器 |
subSet(E fromElement, boolean fromInclusive,E toElement, boolean toInclusive); | 返回Set的部分视图,其元素范围从fromElement到toElement,两端是否包括是由fromInclusive 和toInclusive 两个参数决定的 |
headSet(E toElement, boolean inclusive) | 返回Set中的一部分,这部分小于toElement。返回的集合由原先的集合来支持,因此对原先集合进行修改,会影响返回集合,反之亦然。返回的集合是否包括toElement由inclusive 参数决定 |
tailSet(E fromElement, boolean inclusive) | 返回Set中的一部分,这部分大于fromElement。返回的集合由原先的集合来支持,因此对原先集合进行修改,会影响返回集合,反之亦然。返回的集合是否包括fromElement由inclusive 参数决定 |
subSet(E fromElement, E toElement) | 等同于subSet(fromElement, true, toElement, false) |
headSet(E toElement) | 等同于headSet(toElement, false) |
tailSet(E fromElement) | 等同于tailSet(fromElement, true) |
Java本身提供的有序Set是TreeSort,其内部是通过NavigableMap来实现的。
Map
Java中用Map来表示键值对,一个map中不能包含两个重复的key,一个key最多匹配一个value。Map接口提供了三种集合的展现形式,key的集合,value的集合以及key-value的集合。Map的顺序定义为map集合视图上的迭代器返回的顺序,但是像TreeMap就指定了排序,而HashMap却没有。
SortedMap
在Map的基础上提供了对key进行排序的功能
NavigableMap
这个接口在SortedMap基础上增加了一些对指定元素进行导航的一些API
SortedMap和NavigableMap 也提供了类似SortedSet和NavigableSet的API,只是SortedSet、NavigableSet操作的是元素,而SortedMap和NavigableMap 操作的是键。但是,从源码中可以看出Java中的Set的实现底层是用的Map,Set中的元素作为Map中的key来保存。
上面主要梳理了Java集合中接口所代表的的含义,下面列举出Java中比较重要的集合类(不包括并发)
集合类型 | 描述 |
ArrayList | 一种可以动态增长和缩减的索引序列 |
LinkedList | 一种可以在任意位置进行高效的插入和删除操作的有序序列 |
ArrayDeque | 一种用循环数组实现的双端队列 |
HashSet | 一种没有重复元素的无序集合 |
TreeSet | 一种有序集 |
EnumSet | 一个包含枚举类型值得集 |
LinkedHashSet | 一种可以记住元素插入次序的集合 |
PriorityQueue | 一种允许高效删除最小元素的集合 |
HashMap | 一种存储键/值关联的数据结构 |
TreeMap | 一种键值有序排列的映射表 |
EnumMap | 一种键值属于枚举类型的映射表 |
LinkedHashMap | 一种可以记住键/值项添加次序的映射表 |
WeakHashMap | 一种其值无用武之地后可以被垃圾回收器回收的映射表 |
IdentityHashMap | 一种用==而不是equals比较键值得映射表 |