JAVA集合源码攻坚战(8)——AbstractSequentialList

JAVA集合源码攻坚战(8)——AbstractSequentialList

前言

前面已经初步介绍过了Arraylist了,那么后面就应该讲讲经常会拿来和ArrayList进行对比的LinkedList吧,不过因为这之间还有个区别,因为LinkedList并不是直接继承了AbstractList的,中间还有个抽象类,今天就先来讲讲这个抽象类吧。

正文

AbstractSequentialList继承了AbstractList,这里不多说,想想也能知道,应该是为了实现AbstractList的某些功能,从命名来看,也是一个抽象类,然后是顺序相连的一个list。

JAVA集合源码攻坚战(8)——AbstractSequentialList
可以看出,他和ArrayList是同级的,下面只有一个实现类——LinkedList
内部方法结构也比较简单,毕竟是一个抽象类,没有太多实现
JAVA集合源码攻坚战(8)——AbstractSequentialList

简介

根据java 8 的官方简介
该类提供了一个对list的骨架型的实现。该类实现了一个按次序访问的功能。如果要实现随机访问,应该先使用AbstractList。该类与实现随机访问的方法不同,它不支持随机访问。
实现该方法,只需要提供对listIterator和size方法的实现。
对于一个无法修改的list,开发人员值需要实现该list的迭代器的hasNext,next,hasPrevious,previous和index方法即可。
对于一个可修改的lsit,开发人员额外需要实现set方法。对于一个尺寸可变的list,开发人员需要额外实现迭代器的remove和add方法。
对于他的子类,应该像Collection接口中建议的一样,需要提供无参和一个collention的构造方法。

构造函数

protected AbstractSequentialList() {
    }

没什么好说的,无参构造器

get操作

 public E get(int index) {
        try {
        	// 调用ListIterator迭代获取
            return listIterator(index).next();
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

set操作

public E set(int index, E element) {
        try {
        	// 仍旧利用ListIterator迭代器来操作
            ListIterator<E> e = listIterator(index);
            E oldVal = e.next();
            e.set(element);
            return oldVal;
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

add操作

public void add(int index, E element) {
        try {
            listIterator(index).add(element);
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

remove操作

public E remove(int index) {
        try {
            ListIterator<E> e = listIterator(index);
            E outCast = e.next();
            e.remove();
            return outCast;
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

addAll操作

public boolean addAll(int index, Collection<? extends E> c) {
        try {
            boolean modified = false;
            ListIterator<E> e1 = listIterator(index);
            Iterator<? extends E> e2 = c.iterator();
            while (e2.hasNext()) {
                e1.add(e2.next());
                modified = true;
            }
            return modified;
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }

从上面这些操作来看,都是利用迭代器进行操作的,因为本身该类就要求子类不支持随机访问的,只能按照顺序访问,所以,这就很依赖于迭代器是否涉及的够好,不然很影响该类及其子类的性能。