概述
是一个抽象类。此类提供了 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开发。内容有任何问题,欢迎各位小伙伴们指正,也希望小伙伴们给我点赞和关注,给我留言,一起交流讨论,共同进步。