JDK1.8源码解读之 AbstractList

313 阅读3分钟

概述

是一个抽象类。此类提供了 List 接口的基本实现,以最小化实现由“随机访问”数据存储(例如数组)支持的该接口所需的工作。对于顺序访问数据(例如链表),应优先使用AbstractSequentialList。要实现不可修改的列表,程序员仅需要扩展此类并为get(int)和size()方法提供实现。要实现一个可变列表,程序员必须额外重写set方法,否则会抛出UnsupportedOperationException异常如果list的是长度可变的列表。程序员必须额外实现 add remove 方法。根据 Collection 规范中的建议,程序员通常应提供一个void(无自变量)和collectconstructor。与其他抽象collection实现不同,程序员不必提供迭代器实现。迭代器和列表迭代器由此类在“随机访问”方法之上实现. 此类中每个非抽象方法的文档都详细描述了其实现。如果正在实现的集合允许更有效的实现,则可以覆盖这些方法中的每一个。

继承关系

public abstract class AbstractList extends AbstractCollection implements List 抽象类 继承了 AbstractCollection 实现了 List 接口

成员属性

构造器

唯一的构造函数。用于子类构造函数的调用,通常是隐式的。

protected AbstractList() {}

关键方法

add()

将指定的元素追加到此列表的末尾。,需要子类重写该方法,否则将抛出 UnsupportedOperationException 异常。

public boolean add(E e)
get()

抽象方法,需要子类重写。

abstract public E get(int index);
set()

抛出 UnsupportedOperationException 异常,需要被子类重写。

public E set(int index, E element) {
    throw new UnsupportedOperationException();
}
add()

抛出 UnsupportedOperationException 异常,需要被子类重写。

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}
remove()

抛出 UnsupportedOperationException 异常,需要被子类重写。

public E remove(int index) {
    throw new UnsupportedOperationException();
}
indexOf()

找出某个元素第一次出现的位置

public int indexOf(Object o) {
    ListIterator<E> it = listIterator();
    if (o==null) {
        while (it.hasNext())
            if (it.next()==null)
                return it.previousIndex();
    } else {
        while (it.hasNext())
            if (o.equals(it.next()))
                return it.previousIndex();
    }
    return -1;
}
lastIndexOf()

找出某个元素最后一次出现的位置。

public int lastIndexOf(Object o) {
    ListIterator<E> it = listIterator(size());
    if (o==null) {
        while (it.hasPrevious())
            if (it.previous()==null)
                return it.nextIndex();
    } else {
        while (it.hasPrevious())
            if (o.equals(it.previous()))
                return it.nextIndex();
    }
    return -1;
}
removeRange()

清除所有元素

public void clear() {
    removeRange(0, size());
}
addAll()

添加所有元素到当前list

public boolean addAll(int index, Collection<? extends E> c) {
    rangeCheckForAdd(index);
    boolean modified = false;
    for (E e : c) {
        add(index++, e);
        modified = true;
    }
    return modified;
}
iterator()

新建一个迭代器并返回。

public Iterator<E> iterator() {
    return new Itr();
}
listIterator()
public ListIterator<E> listIterator() {
    return listIterator(0);
}
public ListIterator<E> listIterator(final int index) {
    rangeCheckForAdd(index);
    return new ListItr(index);
}
subList()

返回一个子list

public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<>(this, fromIndex, toIndex) :
            new SubList<>(this, fromIndex, toIndex));
}
equals()

判断两个list是否相同。

public boolean equals(Object o)

内部类

SubList

这是 AbstractList 的内部类。主要是用在AbstractList的subList()方法上。 如代码中的 SubList.set()方法,增加了检查索引是否有效,列表是否被修改过的检查。SubList的其他方法也同样增加了这些校验。

class SubList<E> extends AbstractList<E> {
    
    ...
    private final AbstractList<E> l;
    private final int offset;
    private int size;

    SubList(AbstractList<E> list, int fromIndex, int toIndex) {
        if (fromIndex < 0)
            throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
        if (toIndex > list.size())
            throw new IndexOutOfBoundsException("toIndex = " + toIndex);
        if (fromIndex > toIndex)
            throw new IllegalArgumentException("fromIndex(" + fromIndex +
                                               ") > toIndex(" + toIndex + ")");
        l = list;
        offset = fromIndex;
        size = toIndex - fromIndex;
        this.modCount = l.modCount;
    }
    public E set(int index, E element) {
        // 检查index的范围是否合法。
        rangeCheck(index);
        // 检查是否被修改过。
        checkForComodification();
        return l.set(index+offset, element);
    }
    
}
RandomAccessSubList

该类实现了RandomAccess接口。 该类是AbstractList的内部类,继承自另一个内部类SubList。

class RandomAccessSubList<E> extends SubList<E> implements RandomAccess

希望和大家多多交流


我16年毕业以后,做的是前端,目前打算深入学习java开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。