List接口源码理解

35 篇文章 0 订阅
34 篇文章 0 订阅


前言

本文章帮助大家对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+31n1v0+……+31vn2+vn1
参考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关键字给出默认实现,实现中用列表迭代器遍历每个元素,将排完序的临时对象数组元素设置给此列表元素,排序算法由Arrayssort方法给定,参考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,则返回列表为空。若下标fromIndextoIndex越界(小于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方法),原集合修改不会影响到返回列表,但如果参数集合是不可修改列表,那么返回列表通常不是它的复制(即返回参数本身(本就有非空检验))。


总结

新人源码理解,望大家多多指点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值