首页 > 代码库 > 007 Java集合浅析2

007 Java集合浅析2

在本系列的上一篇教程中,我们已经分析过了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接口下的三个子类型开始出现特性,每种子类型在接口中加入了一些自己的方法。通过这次的分析,我们也可以学到一些设计接口和类继承层次的技巧。

本系列文档会在本人的微信公众号发布,欢迎大家扫码关注。

                技术分享

007 Java集合浅析2