public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
List
接口以最小化来实现该接口由一个“随机访问”数据存储备份所需的工作(如阵列)。
对于顺序存取的数据(如链接列表), AbstractSequentialList
应优先使用此类。
要实现一个不可修改的列表,程序员只需要扩展这个类并提供get(int)
和size()
方法的实现。
要实现可修改的列表,程序员必须另外覆盖set(int, E)
方法(否则会抛出一个UnsupportedOperationException
)。 如果列表是可变大小,则程序员必须另外覆盖add(int, E)
和remove(int)
方法。
根据Collection
接口规范中的建议,程序员通常应该提供一个void(无参数)和集合构造函数。
不像其他的抽象集合实现,程序员不必提供迭代器实现; 迭代器和列表迭代器由此类实现的,对的“随机访问”方法上: get(int)
, set(int, E)
, add(int, E)
和remove(int)
。
该类中每个非抽象方法的文档详细描述了其实现。 如果正在实施的集合承认更有效的实现,则可以覆盖这些方法中的每一种。
这个类是Java Collections Framework的成员。
Modifier and Type | Field and Description |
---|---|
protected int |
modCount
此列表已被
结构修改的次数。
|
Modifier | Constructor and Description |
---|---|
protected |
AbstractList()
唯一的构造函数。
|
Modifier and Type | Method and Description |
---|---|
boolean |
add(E e)
将指定的元素追加到此列表的末尾(可选操作)。
|
void |
add(int index, E element)
将指定的元素插入此列表中的指定位置(可选操作)。
|
boolean |
addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到此列表中的指定位置(可选操作)。
|
void |
clear()
从此列表中删除所有元素(可选操作)。
|
boolean |
equals(Object o)
将指定的对象与此列表进行比较以获得相等性。
|
abstract E |
get(int index)
返回此列表中指定位置的元素。
|
int |
hashCode()
返回此列表的哈希码值。
|
int |
indexOf(Object o)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
|
Iterator<E> |
iterator()
以正确的顺序返回该列表中的元素的迭代器。
|
int |
lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
|
ListIterator<E> |
listIterator()
返回列表中的列表迭代器(按适当的顺序)。
|
ListIterator<E> |
listIterator(int index)
从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
|
E |
remove(int index)
删除该列表中指定位置的元素(可选操作)。
|
protected void |
removeRange(int fromIndex, int toIndex)
从此列表中删除所有索引在
fromIndex 之间的
fromIndex ,包括
toIndex ,独家。
|
E |
set(int index, E element)
用指定的元素(可选操作)替换此列表中指定位置的元素。
|
List<E> |
subList(int fromIndex, int toIndex)
返回此列表中指定的
fromIndex (含)和
toIndex之间的视图。
|
addAll, contains, containsAll, isEmpty, remove, removeAll, retainAll, size, toArray, toArray, toString
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
addAll, contains, containsAll, isEmpty, remove, removeAll, replaceAll, retainAll, size, sort, spliterator, toArray, toArray
parallelStream, removeIf, stream
protected transient int modCount
该字段由迭代器和列表迭代器实现使用,由iterator
和listIterator
方法返回。 如果该字段的值意外更改,迭代器(或列表迭代器)将抛出一个ConcurrentModificationException
响应next
, remove
, previous
, set
或add
操作。 这提供了故障快速行为,而不是面对在迭代期间的并发修改的非确定性行为。
子类使用此字段是可选的。 如果一个子类希望提供故障快速迭代器(和列表迭代器),那么它只需要在其add(int, E)
和remove(int)
方法(以及它覆盖的任何其他方法导致对列表的结构修改)中增加该字段。 对add(int, E)
或remove(int)
单一调用必须向该字段添加不超过一个,否则迭代器(和列表迭代器)将抛出伪造的ConcurrentModificationExceptions
。 如果实现不希望提供故障快速迭代器,则该字段可能会被忽略。
public boolean add(E e)
支持此操作的列表可能会限制可能添加到此列表中的元素。 特别地,一些列表将拒绝添加null元素,而其他列表将对可能添加的元素的类型施加限制。 列表类应在其文档中明确指定可能添加哪些元素的限制。
这个实现调用add(size(), e)
。
请注意,此实现将抛出UnsupportedOperationException
,除非add(int, E)
被覆盖。
add
在界面
Collection<E>
add
在界面
List<E>
add
在
AbstractCollection<E>
e
- 要附加到此列表的元素
true
(由
Collection.add(E)
指定 )
UnsupportedOperationException
-如果
add
操作不受此列表支持
ClassCastException
- 如果指定元素的类阻止将其添加到此列表中
NullPointerException
- 如果指定的元素为空,并且此列表不允许空元素
IllegalArgumentException
- 如果此元素的某些属性阻止将其添加到此列表
public abstract E get(int index)
get
在接口
List<E>
index
- 要返回的元素的索引
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index >= size() )
public E set(int index, E element)
这个实现总是抛出一个UnsupportedOperationException
。
set
在界面
List<E>
index
- 要替换的元素的索引
element
- 要存储在指定位置的元素
UnsupportedOperationException
-如果
set操作不受此列表支持
ClassCastException
- 如果指定元素的类阻止将其添加到此列表中
NullPointerException
- 如果指定的元素为空,并且此列表不允许空元素
IllegalArgumentException
- 如果指定元素的某些属性阻止其添加到此列表中
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index >= size() )
public void add(int index, E element)
这个实现总是抛出一个UnsupportedOperationException
。
add
中的
List<E>
index
- 要在其中插入指定元素的索引
element
- 要插入的元素
UnsupportedOperationException
-如果
add操作不受此列表支持
ClassCastException
- 如果指定元素的类阻止将其添加到此列表中
NullPointerException
- 如果指定的元素为空,并且该列表不允许空元素
IllegalArgumentException
- 如果指定元素的某些属性阻止将其添加到此列表
IndexOutOfBoundsException
- 如果指数超出范围(
index < 0 || index > size() )
public E remove(int index)
这个实现总是抛出一个UnsupportedOperationException
。
remove
在界面
List<E>
index
- 要删除的元素的索引
UnsupportedOperationException
-如果
remove操作不受此列表支持
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index >= size() )
public int indexOf(Object o)
这个实现首先得到一个列表迭代器(带有listIterator()
)。 然后,它遍历列表,直到找到指定的元素或达到列表的结尾。
indexOf
在接口
List<E>
o
- 要搜索的元素
ClassCastException
- 如果指定元素的类型与此列表不兼容(
optional )
NullPointerException
- 如果指定的元素为空,并且该列表不允许空元素(
optional )
public int lastIndexOf(Object o)
这个实现首先得到一个列表迭代器,它指向列表的末尾(带有listIterator(size())
)。 然后,它在列表中向后迭代,直到找到指定的元素,或者到达列表的开头。
lastIndexOf
在界面
List<E>
o
- 要搜索的元素
ClassCastException
- 如果指定元素的类型与此列表不兼容(
optional )
NullPointerException
- 如果指定的元素为空,此列表不允许空元素(
optional )
public void clear()
这个实现调用removeRange(0, size())
。
请注意,此实现将抛出UnsupportedOperationException
,除非remove(int index)
或removeRange(int fromIndex, int toIndex)
被覆盖。
clear
中的
Collection<E>
clear
在界面
List<E>
clear
在
AbstractCollection<E>
UnsupportedOperationException
-如果
clear
操作不受此列表支持
public boolean addAll(int index, Collection<? extends E> c)
此实现越过指定的集合和在其上迭代的迭代器,插入在适当的位置,一次一个,使用从所述迭代器获得到该列表中的元素add(int, E)
。 许多实现将覆盖此方法的效率。
请注意,此实现将抛出UnsupportedOperationException
,除非add(int, E)
被覆盖。
addAll
在接口
List<E>
index
- 从中指定集合插入第一个元素的索引
c
- 包含要添加到此列表的元素的集合
UnsupportedOperationException
-如果
addAll操作不受此列表支持
ClassCastException
- 如果指定集合的元素的类阻止将其添加到此列表中
NullPointerException
- 如果指定的集合包含一个或多个空元素,并且该列表不允许空元素,或者如果指定的集合为空
IllegalArgumentException
- 如果指定集合的元素的某些属性阻止其添加到此列表中
IndexOutOfBoundsException
- 如果指数超出范围(
index < 0 || index > size() )
public Iterator<E> iterator()
此实现返回一个简单的实现Iterator接口,依托后台列表的size()
, get(int)
和remove(int)
方法。
请注意,除非列表的remove(int)
方法被覆盖,否则通过此方法返回的迭代器将抛出UnsupportedOperationException
以响应其remove
方法。
如同(protected) modCount
字段的规范中所描述的那样,这种实现可以面对并发修改来抛出运行时异常。
public ListIterator<E> listIterator()
此实现返回listIterator(0)
。
listIterator
在界面
List<E>
listIterator(int)
public ListIterator<E> listIterator(int index)
next
。
初始调用previous
将返回指定索引减1的元素。
此实现返回一个简单的贯彻ListIterator
扩展了实施接口Iterator
通过返回的接口iterator()
方法。 该ListIterator
实现依赖于后台列表的get(int)
, set(int, E)
, add(int, E)
和remove(int)
方法。
请注意,此实现返回的列表迭代器将抛出一个UnsupportedOperationException
响应其remove
, set
和add
方法,除非列表的remove(int)
, set(int, E)
和add(int, E)
方法被覆盖。
如同(protected) modCount
字段的规范中所描述的那样,这种实现可以面对并发修改来抛出运行时异常。
listIterator
在界面
List<E>
index
- 要从列表迭代器返回的第一个元素的索引(通过调用
next
)
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index > size()
)
public List<E> subList(int fromIndex, int toIndex)
该方法消除了对显式范围操作(对于数组通常存在的排序)的需要。 任何期望列表的操作都可以通过传递一个子列表视图而不是整个列表来用作范围操作。 例如,以下成语从列表中移除了一系列元素:
list.subList(from, to).clear();
可以为indexOf和lastIndexOf构造类似的成语,并且Collections类中的所有算法都可以应用于子列表 。
如果支持列表(即,此列表)以除了通过返回的列表之外的任何方式进行结构修改 ,则此方法返回的列表的语义将变得未定义。 (结构修改是那些改变此列表的大小,或以其他方式扰乱它,使得正在进行的迭代可能产生不正确的结果)。
此实现返回一个子AbstractList
的列表。 子类在私有字段中存储支持列表modCount
列表的偏移量,子列表的大小(可以在其生命周期内更改)以及后备列表的预期值modCount
。 子类有两个变体,其中一个实现了RandomAccess
。 如果此列表实现了RandomAccess
则返回的列表将是实现RandomAccess
的子类的实例。
子类的set(int, E)
, get(int)
, add(int, E)
, remove(int)
, addAll(int, Collection)
和removeRange(int, int)
方法都委托给支持抽象列表上的相应方法,边界检查的指标和调整偏移后。 addAll(Collection c)
方法只返回addAll(size, c)
。
listIterator(int)
方法通过支持列表上的列表迭代器返回“包装对象”,该列表是使用后备列表上的相应方法创建的。 iterator
方法只返回listIterator()
,而size
方法只返回子类的size
字段。
所有方法首先检查后台列表的实际modCount
是否等于其预期值,如果不是,则抛出ConcurrentModificationException
。
subList
在接口
List<E>
fromIndex
-
fromIndex
低端点(含)
toIndex
-
toIndex
高端点(排他)
IndexOutOfBoundsException
- 如果端点索引值超出范围
(fromIndex < 0 || toIndex > size)
IllegalArgumentException
- 如果端点索引为
(fromIndex > toIndex)
public boolean equals(Object o)
true
当且仅当指定的对象也是列表时,两个列表都具有相同的大小,并且两个列表中所有相应的元素对相等 。
(两个元素e1
和e2
等于 (e1==null ? e2==null : e1.equals(e2))
)。换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。
此实现首先检查指定的对象是否是此列表。 如果是,则返回true
; 如果不是,它检查指定的对象是否是一个列表。 如果没有,则返回false
; 如果是这样,它会遍历两个列表,比较相应的元素对。 如果任何比较返回false
,此方法返回false
。 如果任何一个迭代器在其他元素之前用完,则返回false
(因为列表的长度不等); 否则返回true
当迭代完成。
equals
中的
Collection<E>
equals
在接口
List<E>
equals
在
Object
o
- 要与此列表相等的对象进行比较
true
如果指定的对象等于此列表
Object.hashCode()
, HashMap
public int hashCode()
这个实现在List.hashCode()
方法的文档中完全使用用于定义列表哈希函数的代码 。
hashCode
在接口
Collection<E>
hashCode
在接口
List<E>
hashCode
在
Object
Object.equals(java.lang.Object)
,
System.identityHashCode(java.lang.Object)
protected void removeRange(int fromIndex, int toIndex)
fromIndex
(含)和toIndex
之间的元素。
将任何后续元素移动到左侧(减少其索引)。
此通话由(toIndex - fromIndex)
元素缩短列表。
(如果是toIndex==fromIndex
,这个操作没有效果)
这种方法是由称为clear
这个名单及其子列表上的操作。 重写此方法,以便在列表实现的内部的优点是可以大幅度提高性能clear
操作列表和其子列表上。
此实现变得定位之前的列表迭代fromIndex
,并反复调用ListIterator.next
其次是ListIterator.remove
,直到整个范围内已被删除。 注意:如果ListIterator.remove
需要线性时间,则此实现需要二次时间。
fromIndex
- 要删除的第一个元素的索引
toIndex
- 要删除的最后一个元素后的索引