在本系列的上一篇教程中,我们已经分析过了Collection组的两个顶级接口Iterable和Collection,接下来我们来分析一下Collection接口的子类型。
首先,我们看一下List接口,该接口映射的是数据结构中非常基础和常用的列表类型。参看源码,发现该接口在Collection接口的基础上增加了一些列表都有的方法,部分源码如下:
public interface List<E> extends Collection<E> {
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
List<E> subList(int fromIndex, int toIndex);
}
针对此List接口,我们需要注意两点:一是该接口除了有返回通用Iterator接口的方法,还有返回特定迭代器接口ListIterator的方法。我们看一下ListIterator接口的源码:
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}
可以看到ListIterator接口根据底层List的特点新增了向前遍历和其他修改和新增元素的方法,使得对于底层List的操作更加方便和高效;二是注意其中的subList()方法,该方法返回的子List是原始List的一个视图,所以对子List的修改会导致原始List修改,但是原始List进行修改会如何影响子List是不确定的。
其次,我们再看一下Collection接口下的另一个直接子类型Set接口,该接口对应的是基础数据结构中的集合类型。该接口并没有在Collection接口的基础上引入任何特性。部分Set接口的源码如下:
public interface Set<E> extends Collection<E> {
int size();
int hashCode();
}
最后,我们看看Collection接口下的另一个直接子类型Queue接口,该接口映射的是 基础数据结构中的队列类型。该接口在Collection接口的基础上添加了诸如poll()、peek()等队列特有方法,我们看一下其源码:
public interface Queue<E> extends Collection<E> {
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
}
仔细观察以后,我们可以把这六个函数分成三组:add()和offer()都是用于添加元素,在集合是固定大小的情况,offer()性能更高;remove()和poll()都是用于删除首元素,区别在于当集合为空时是返回null还是抛出异常;element()和peek()函数都是用于返回首元素,区别在于当集合为空时是抛出异常还是返回nll。
经过以上的讨论和学习发现,Collection接口下的三个子类型开始出现特性,每种子类型在接口中加入了一些自己的方法。通过这次的分析,我们也可以学到一些设计接口和类继承层次的技巧。
本系列文档会在本人的微信公众号发布,欢迎大家扫码关注。