集合相关接口
Java 集合可以分为Collection
和Map
两种体系,两种体系的类关系图如下:
Collection
体系:
Map
体系:
Collection
接口:单列数据,定义了存取一组对象方法的集合;- 子接口
List
,元素有序,可重复的集合; - 子接口
Set
,元素无序,不可重复的集合; - 子接口
Queue
,
- 子接口
Collection和Map
Collection和Map虽都是与集合处理有关的接口,但二者之间并没有直接联系。
Collection(接口)
Collection是集合类的根接口,java中无该接口的直接实现类。但有两个接口继承于Collection,分别是Set
和List
。
AbstractCollection
Collection接口的部分实现
Set(接口)
Set 不能包含重复的元素,无序(TreeSet是二叉排序树)。
SortedSet(接口)
有序的Set,其中E必须实现 Comparable
接口(或者被指定的比较器所接受),所有这些元素都必须是可互相比较的。
AbstractSet(抽象类)
提供了Set接口的部分实现。
HashSet(实现类)
此实现不是同步的,即不是线程安全的,要得到同步的HashSet,方法如下:
1 | Set s = Collections.synchronizedSet(new HashSet()); |
TreeSet(实现类)
此实现不是同步的,即不是线程安全的,要得到同步的TreeSet,方法如下:
1 | Set s = Collections.synchronizedSortedSet(new TreeSet()); |
List
List是一个有序的集合,可以包含重复元素,且可以通过索引方式来访问。
AbstractList
List接口的部分实现。
- 实现不可修改的列表,只需实现get(int)和size()方法的实现。
- 实现可修改的列表(列表大小不可变),还要重写set(int, E)方法。
- 实现可修改的列表(列表大小可变),要重写set(int, E)、add(int, E)和remove(int)。
- 不必提供迭代器实现
AbstractSequentialList
AbstractList
1 | public abstract ListIterator<E> listIterator(int index); |
也就是说实现该类只要实现listIterator(int index)
方法即可,它的其他方法实现上都依赖于上面这个方法。
LinkedList是它的具体实现。
ArrayList(实现类)
List
接口的大小可变数组的实现。(大致功能等同于Vector类,但要注意,此实现不是同步的,即不是线程安全的),默认列表长度为10。
Vector(实现类)
它是同步的,即线程安全的可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector
的大小可以根据需要增大或缩小,以适应创建 Vector
后进行添加或移除项的操作。
LinkedList(实现类)
List
接口的链接列表实现。注意,此实现不是同步的,即不是线程安全的
Queue(接口)
队列,在处理元素前用于保存元素的集合,通常一FIFO(先进先出)的方式排序各个元素(优先级队列和LIFO队列除外)。
每个队列的实现必须指定其顺序属性。
BlockingQueue
支持两个附加操作的队列,即put(E e)(存储元素时等待队列空间变得可用)和take()(获取元素时等待队列变为非空)。
BlockingQueue的实现是线程安全的。
Deque(接口)
一个线性集合,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque
实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
BlockingDeque
支持两个附加操作的 Queue
,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。对应的方法分别是:
1 | // 头部 |
BlockingDeque的实现是线程安全的。
Map(接口)
Map中包含了K-V对,不能包含重复的key,但可以包含相同的value,无序(TreeMap是二叉排序树)。Map
接口提供三种集合视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容,对应的方法分别是:
1 | // 映射关系集合 |
Entry(Map内部接口)
表示K和V之间的映射关系。获得映射关系对象引用的唯一方法是通过Set
SortedMap(接口)
进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。
内容比较多,看来一个晚上写不完,未完待续。。。。。。
Iterator和Iterable
Iterator
功能说明
Iterator表示对Collection进行迭代的迭代器,功能比之前使用的Enumeration更加完善,取代了Enumeration,与其不同的地方有以下两点:
- 允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection中删除元素;
- 方法的名称得到了改进(见名知义);
方法说明
boolean hasNext()
如果仍有元素可以迭代,则返回
true
。
T next()
返回迭代的下一个元素。
void remove()
从迭代器指向的集合中移除迭代器返回的最后一个元素。
forEachRemaining()
Java 1.8之后新增:未被迭代器迭代处理的元素仍保留自己的一些Action操作
Iterable
功能说明
一个类实现了Iterable
实际上,类似于Xxxable
这类的接口,通常都是使其实现类具有某种本来没有的功能,如 实现Comparable
就可以于T类对象进行比较; 实现Serializable就可以进行序列化等;
方法说明
Iterator<T> iterator()
获取一个迭代器
void forEach(Consumer<? super T> action)
在未被迭代器处理之前,仍可进行起已有的action(也就是说在未被迭代处理之前,集合中的元素仍然是独立的,可以进行自身已经定义好的各种action操作),默认实现如下:
1 | default void forEach(Consumer<? super T> action) { |
Spliterator<T> spliterator()
在当前Iterable
1 | default Spliterator<T> spliterator() { |
那么何为Spliterator