List接口
List是一个有序、可以重复,可以有null元素的集合
类图
官方文档
List成员方法
其中“有序”,指的是存储的时候按照元素的添加顺序进行存储和获取。
- 有序的集合(也成为序列)。该接口的开发人员可以精确的控制列表中每个元素的插入位置。开发人员可以通过索引访问元素,并搜索列表中的元素
- 与Set不同的是,列表通常允许重复的元素。更正式的说,列表通常允许对元素e1和e2存储在列别中,其中
e1.equals(e2)
。如果实现该接口的类允许存在null元素,那么就允许存在多个null。
AbstractList抽象类
类图
官方文档
public abstract class AbstractList<E>
extends AbstractCollection<E>
implements List<E>
- AbstractList抽象类实现了很多List接口中的方法,减轻了想要实现List接口的开发人员的负担,如果开发人员想要实现List接口,那么他可以直接继承AbstractList类然后重写对应的方法就可以了。如果开发人员想要顺序访问数据(如LinkedList类),那么继承
AbstractSequentialList
类比继承AbstractList
要更高效 - 如果开发人员想要实现一个不可修改的List,那么只需要继承该类,然后重写两个方法:
get(int)
和size()
方法 - 如果开发人员想要实现一个可修改的List,那么需要重写
set()
方法,如果不重写会抛出UnsupportedOperationException
异常,如果size()
的大小是可变的,那么开发人员还需要重写add(int, E)
和remove(int)
方法 - 该类的子类需要有2个构造方法,一个是空参,一个是参数类型为Collection的构造方法
- 该类的子类可以不实现
iterator
方法,因为这个抽象类已经实现了iterator()
方法
AbstractList的成员变量
该类只有一个成员变量:该List在结构上已经被修改的次数
protected transient int modCount = 0;
Iterator迭代器和ListIterator迭代器会使用到该变量,如果迭代器的expectModCount与该变量的值不同,那就会抛出ConcurrentModificationException
异常,在官方文档中称其为* fail-fast *