文章目录
前言
本文章帮助大家对List
接口的理解。
一、概述
List
意为列表。顾名思义,就是同一类对象(元素)的序列。通常它为可重复元素的,可以有空元素,可对给定位置进行增删查改等,有查找、排序等功能。符合序列的特性,且需要这些功能的,建议实现此接口。
二、源码理解
包
package java.util;
import java.util.List;
使用List
接口时,需引入此包。
List接口
public interface List<E> extends Collection<E> { /*...*/ }
使用接口时传入泛型E
,为列表元素的类型。继承了Collection
接口,使列表具有集合(无特殊说明,本文章“集合”指Collection
)的表现。参考Collection
接口。
重点:此接口除了从Collection
接口所继承的Iterable
接口中继承了返回普通迭代器的iterator
方法,它自身还提供了ListIterator
(列表迭代器)接口,此迭代器能双向遍历,还能添加、设置元素、获取上/下一个元素索引下标。参考Iterator
接口、ListIterator
接口。
List方法
size
int size();
重写Collection
接口的int size()
方法,参考Collection.size
方法。
返回元素个数。若列表包含元素个数大于Integer.MAX_VALUE
,则返回Integer.MAX_VALUE
。
isEmpty
boolean isEmpty();
重写Collection
接口的boolean isEmpty()
方法,参考Collection.isEmpty
方法。
判断列表是否为空。
equals
boolean equals(Object o);
重写Collection
类的boolean equals(Object obj)
方法,参考Collection.equals
方法。
判断列表和对象o
是否相同/相等。
注意:与集合的其它不同实现类的对象的比较,应该返回false
。要返回true
的一个前提是它们的元素的顺序应该一致。
hashCode
int hashCode();
重写Collection
类的int hashCode()
方法,参考Collection.hashCode
方法。
返回此列表的哈希码。
计算逻辑如同Arrays.hashCode
,计算公式为(其中
v
i
v_{i}
vi 为参数values
的第
i
i
i个元素的哈希码,
n
n
n 为对象数量):
3
1
n
+
3
1
n
−
1
∗
v
0
+
…
…
+
31
∗
v
n
−
2
+
v
n
−
1
31 ^ {n} + 31 ^ {n-1} * v_{0} + …… + 31 * v_{n-2} + v_{n-1}
31n+31n−1∗v0+……+31∗vn−2+vn−1
参考Arrays
类。
iterator
Iterator<E> iterator();
重点:重写Collection
接口的Iterator<E> iterator()
方法,参考Collection.iterator
方法。
返回遍历元素的迭代器。
listIterator
ListIterator<E> listIterator();
重点:返回遍历元素的列表迭代器。
ListIterator<E> listIterator(int index);
返回覆盖下标为index
及之后的元素的列表迭代器。若index
超出下标范围(即小于0或大于此列表大小),则抛出IndexOutOfBoundsException
异常。
注意:首次调用该列表迭代器的next
方法返回的元素是下标为index
的元素。
spliterator
default Spliterator<E> spliterator() {
if (this instanceof RandomAccess) {
return new AbstractList.RandomAccessSpliterator<>(this);
} else {
return Spliterators.spliterator(this, Spliterator.ORDERED);
}
}
重写Collection
接口的Spliterator<E> spliterator()
方法,参考Collection.Spliterator
方法。
返回覆盖此列表元素的分割迭代器,可用来遍历、分割序列。default
关键字给出默认实现。参考RandomAccess
接口、AbstractList.RandomAccessSpliterator
类、Spliterators.spliterator
方法。
get
E get(int index);
返回列表下标为index
的元素。若index
超出下标范围(即小于0或大于等于此列表大小),则抛出IndexOutOfBoundsException
异常。
set
E set(int index, E element);
将列表下标为index
的元素替换为element
,并返回原来的元素(可选)。
若实现类不支持set
方法,则抛出UnsupportedOperationException
异常;若因element
的类而不能加入列表中,则抛出ClassCastException
异常;若元素element
为空而列表不允许有空元素,则抛出NullPointerException
异常;若因element
的一些属性而不能加入列表中,则抛出IllegalArgumentException
异常;若index
超出下标范围(即小于0或大于等于此列表大小),则抛出IndexOutOfBoundsException
异常。
indexOf
int indexOf(Object o);
返回列表中一个等于对象o
的元素的下标,若无则返回-1。通常认为找到最小的下标i
,存在Objects.equals(o, get(i))
则返回i
,否则返回-1。
若对象o
的类型和列表类型不能比较,则抛出ClassCastException
异常(可选);若对象o
为空而列表不允许有空元素,则抛出NullPointerException
异常(可选)。
lastIndexOf
int lastIndexOf(Object o);
返回列表中一个等于对象o
的元素的下标,若无则返回-1。通常认为找到最大的下标i
,存在Objects.equals(o, get(i))
则返回i
,否则返回-1。
若对象o
的类型和列表类型不能比较,则抛出ClassCastException
异常(可选);若对象o
为空而列表不允许有空元素,则抛出NullPointerException
异常(可选)。
contains
boolean contains(Object o);
重写Collection
接口的boolean contains(Object o)
方法,参考Collection.contains
方法。
判断列表是否包含对象o
。通常认为找到一个元素e
,存在Objects.equals(o, e)
则返回true
。参考Objects.equals
方法。
若对象o
的类型和列表类型不能比较,则抛出ClassCastException
异常(可选);若对象o
为空而列表不允许有空元素,则抛出NullPointerException
异常(可选)。
containsAll
boolean containsAll(Collection<?> c);
重写Collection
接口的boolean containsAll(Collection<?> c)
方法,参考Collection.containsAll
方法。
判断此列表是否包含集合c
的所有元素。若都包含则返回true
。
若c
中某元素的类型和此列表类型不能比较,则抛出ClassCastException
异常(可选);若c
中某元素为空而此列表不允许有空元素(可选),或c
为空,则抛出NullPointerException
异常。
add
boolean add(E e);
重写Collection
接口的boolean add(E e)
方法,参考Collection.add
方法。
添加元素e
到此列表末尾(可选)。返回true
。
若实现类不支持add
操作,则抛出UnsupportedOperationException
异常;若因e
的类而不能加入列表中,则抛出ClassCastException
异常;若元素e
为空而列表不允许有空元素,则抛出NullPointerException
异常;若因e
的一些属性而不能加入列表中,则抛出IllegalArgumentException
异常。
void add(int index, E element);
添加元素element
到此列表指定index
位置,后续元素(若有的话)会后移(可选)。类似add(E e)
方法,不同的是,若index
超出下标范围(即小于0或大于此列表大小),则抛出IndexOutOfBoundsException
异常。
addAll
boolean addAll(Collection<? extends E> c);
重写Collection
接口的boolean addAll(Collection<? extends E> c)
方法,参考Collection.addAll
方法。
添加集合c
的所有元素到此列表末尾,元素顺序按c
的迭代器遍历顺序(可选)。若成功添加,返回true
。
若实现类不支持addAll
操作,则抛出UnsupportedOperationException
异常;若因c
中某元素的类而不能加入此列表中,则抛出ClassCastException
异常;若c
中某元素为空而此列表不允许有空元素,或c
为空,则抛出NullPointerException
异常;若因c
中某元素的一些属性而不能加入此列表中,则抛出IllegalArgumentException
异常。
boolean addAll(int index, Collection<? extends E> c);
添加集合c
的所有元素到此列表指定index
位置,后续元素(若有的话)会后移(可选)。类似addAll(Collection<? extends E> c)
方法,不同的是,若index
超出下标范围(即小于0或大于此列表大小),则抛出IndexOutOfBoundsException
异常。
remove
boolean remove(Object o);
重写Collection
接口的boolean remove(Object o)
方法,参考Collection.remove
方法。
从列表中移除一个等于对象o
的元素(若有的话)(可选)。通常认为找到最小的下标i
,存在Objects.equals(o, get(i))
则移除。若成功移除,返回true
。
若对象o
的类型和列表类型不能比较,则抛出ClassCastException
异常(可选);若对象o
为空而列表不允许有空元素,则抛出NullPointerException
异常(可选);若实现类不支持remove
操作,则抛出UnsupportedOperationException
异常。
E remove(int index);
从列表中移除指定index
位置的元素,后续元素(若有的话)会前移(可选),并返回原来的元素。
若实现类不支持remove
操作,则抛出UnsupportedOperationException
异常;若index
超出下标范围(即小于0或大于等于此列表大小),则抛出IndexOutOfBoundsException
异常。
removeAll
boolean removeAll(Collection<?> c);
重写Collection
接口的boolean removeAll(Collection<?> c)
方法,参考Collection.removeAll
方法。
从此列表中移除集合c
中的所有元素(有包含的话)(可选)。若成功移除,返回true
。
若c
中某对象的类型和此列表类型不能比较,则抛出ClassCastException
异常(可选);若c
中某对象为空而此列表不允许有空元素(可选),或c
为空,则抛出NullPointerException
异常;若实现类不支持removeAll
操作,则抛出UnsupportedOperationException
异常。
retainAll
boolean retainAll(Collection<?> c);
重写Collection
接口的boolean retainAll(Collection<?> c)
方法,参考Collection.retainAll
方法。
保留此列表中有包含在集合c
中的所有元素,即移除其它c
中没有的元素(可选)。若移除成功,返回true
。
若c
中某对象的类型和此列表类型不能比较,则抛出ClassCastException
异常(可选);若c
中某对象为空而此列表不允许有空元素(可选),或c
为空,则抛出NullPointerException
异常;若实现类不支持retainAll
操作,则抛出UnsupportedOperationException
异常。
replaceAll
default void replaceAll(UnaryOperator<E> operator) { /*...*/ }
替换此列表中的各个元素,替换规则由“一元运算符”operator
给定,参考UnaryOperator
接口。default
关键字给出默认实现,实现中用列表迭代器遍历每个元素,用operator.apply
方法转化设置元素。
若operator
运算返回空而此列表不允许有空元素(可选),或operator
为空,则抛出NullPointerException
异常;若此列表不可修改,或列表迭代器不支持set
方法,则抛出UnsupportedOperationException
异常。
clear
void clear();
重写Collection
接口的void clear()
方法,参考Collection.clear
方法。
清空列表(可选)。若实现类不支持clear
操作,则抛出UnsupportedOperationException
异常。
sort
default void sort(Comparator<? super E> c) { /*...*/ }
对元素进行稳定排序(升序),元素大小规则由比较器c
给定,参考Comparator
接口,若c
为空,则需要所有元素实现了Comparable
接口。default
关键字给出默认实现,实现中用列表迭代器遍历每个元素,将排完序的临时对象数组元素设置给此列表元素,排序算法由Arrays
的sort
方法给定,参考Arrays
类。
若使用比较器c
不能比较列表中某些元素,则抛出ClassCastException
异常;若c
违反“比较器约束”,则抛出IllegalArgumentException
异常(可选);若其列表迭代器不支持set
操作,则抛出UnsupportedOperationException
异常。
重点:使用了TimSort归并算法,时间复杂度在 O ( n l o g n ) O(nlogn) O(nlogn)以下。
toArray
Object[] toArray();
重写Collection
接口的Object[] toArray()
方法,参考Collection.toArray
方法。
返回包含所有元素的对象数组。
注意:返回数组元素顺序同列表元素顺序。返回的数组新创建了空间,不影响原来的列表。
<T> T[] toArray(T[] a);
重写Collection
接口的<T> T[] toArray(T[] a)
方法,参考Collection.toArray
方法。
传入泛型T
,为返回数组的元素的类型。返回包含所有元素的对象数组。若a
数组大小足够存储列表元素,那元素将存它里面(多余的空间第一个位置设空);否则将创建返回新的数组。
若数组运行时类型不是所有列表元素运行时类型的超类型,则抛出ArrayStoreException
异常;若数组为空,则抛出NullPointerException
异常。
注意:返回数组元素顺序同列表元素顺序。返回数组的运行时类型是a
的类型。toArray(new Object[0])
功能和toArray()
相同。
subList
List<E> subList(int fromIndex, int toIndex);
返回列表的一部分的视图(也为列表),其从下标fromIndex
开始(包含)到toIndex
结束(不包含)。若fromIndex
等于toIndex
,则返回列表为空。若下标fromIndex
、toIndex
越界(小于0或大于此列表大小)或fromIndex
大于toIndex
,抛出IndexOutOfBoundsException
异常。
重点:返回列表受此列表支撑,对返回列表的非结构修改也会反映到此列表上,反之亦然。此列表所有可选的操作,对于返回列表都是支持的。可利用该方法对此列表的一部分范围数据进行操作,如:
list.subList(from, to).clear();
注意:若列表结构可修改(如改变大小),那么返回列表的语义是未定义的。列表结构修改可能导致正在进行的迭代产生不正确的结果。
of
static <E> List<E> of() {
return (List<E>) ImmutableCollections.EMPTY_LIST;
}
静态方法,传入泛型E
,为返回列表的元素类型。返回不包含元素的不可修改列表。参考ImmutableCollections
类。
static <E> List<E> of(E e1) {
return new ImmutableCollections.List12<>(e1);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。若存在为空的参数,则抛出NullPointerException
异常。
static <E> List<E> of(E e1, E e2) {
return new ImmutableCollections.List12<>(e1, e2);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5, e6);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5, e6, e7);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5, e6, e7, e8);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5, e6, e7, e8, e9);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {
return ImmutableCollections.listFromTrustedArray(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
}
静态方法,传入泛型E
,为传入值及返回列表的元素类型。返回包含参数元素的不可修改列表。类似of(E e1)
方法。
static <E> List<E> of(E... elements) {
switch (elements.length) { // implicit null check of elements
case 0:
var list = (List<E>) ImmutableCollections.EMPTY_LIST;
return list;
case 1:
return new ImmutableCollections.List12<>(elements[0]);
case 2:
return new ImmutableCollections.List12<>(elements[0], elements[1]);
default:
return ImmutableCollections.listFromArray(elements);
}
}
静态方法,传入泛型E
,为传入元素及返回列表的元素类型。返回包含参数元素的不可修改列表。若存在为空的参数,或数组参数为空,则抛出NullPointerException
异常。
注意:...
可变参数可以是多个元素参数或是一个数组参数,但参数是一个数组的话,通过泛型E
来判断此参数应当视为一个元素还是一个数组。如下面例子,array
应视为一个参数,调用的方法是of(E)
:
String[] array = ... ;
List<String[]> list = List.<String[]>of(array);
copyOf
static <E> List<E> copyOf(Collection<? extends E> coll) {
return ImmutableCollections.listCopy(coll);
}
静态方法,传入泛型E
,为传入集合元素及返回列表的元素类型。返回包含集合coll
的所有元素的不可修改列表(按coll
的迭代器的元素顺序)。若集合coll
中存在为空的元素,或集合coll
为空,则抛出NullPointerException
异常。
注意:返回列表通常是集合参数的复制(使用了Collection.toArray
进行复制,使用了of
方法包含非空检验。参考Collection.toArray
方法),原集合修改不会影响到返回列表,但如果参数集合是不可修改列表,那么返回列表通常不是它的复制(即返回参数本身(本就有非空检验))。
总结
新人源码理解,望大家多多指点。