Skip to content

List

鉴于Java中数组用来存储数据的局限性,我们通常使用java.util.List替代数组。

Java 中的 ListCollection 体系下的一个重要分支,特点是:元素有序

List特点

  • 有序:元素按插入顺序排列

  • 可重复:可以存相同元素

  • 支持索引:可以通过下标访问

  • 元素为 Object类型,并且可以为null

实现类

实现类特点
ArrayList底层数组,查询快,增删慢
LinkedList双向链表,增删快,查询慢
Vector线程安全(已不推荐使用)

ArrayList

ArrayList 是 List 接口的主要实现类。本质上,ArrayList是对象引用的一个”变长”数组

LinkedList

对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。这是由底层采用链表(双向链表)结构存储数据决定的。

Vector

线程安全(已不推荐使用)

Interface List

ListCollection 的基础上,增加了按索引访问、插入、替换、删除等能力。

E get(int index)

根据下标获取指定位置的元素。

java
E get(int index);
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Go");

String value = list.get(1);
System.out.println(value); // Python

下标从 0 开始,如果索引越界,会抛出 IndexOutOfBoundsException

void add(int index, E element)

在指定位置插入元素,原来位置及后面的元素整体后移。

java
void add(int index, E element);
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Go");

list.add(1, "Python");
System.out.println(list); // [Java, Python, Go]

E set(int index, E element)

替换指定位置元素,并返回被替换的旧元素。

java
E set(int index, E element);
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");

String oldValue = list.set(1, "Golang");
System.out.println(oldValue); // Python
System.out.println(list);     // [Java, Golang]

boolean addAll(int index, Collection<? extends E> c)

在指定位置插入一个集合中的所有元素。

java
boolean addAll(int index, Collection<? extends E> c);
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Go");

List<String> other = List.of("Python", "C++");

boolean result = list.addAll(1, other);
System.out.println(result); // true
System.out.println(list);   // [Java, Python, C++, Go]

返回值:

  • true:当前集合发生了变化
  • false:当前集合没有变化

E remove(int index)

删除指定下标元素,并返回被删除的元素。

java
E remove(int index);
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Go");

String removed = list.remove(1);
System.out.println(removed); // Python
System.out.println(list);    // [Java, Go]

int indexOf(Object o)

返回指定元素第一次出现的下标;如果不存在,返回 -1

java
int indexOf(Object o);
java
List<String> list = List.of("Java", "Python", "Java");

System.out.println(list.indexOf("Java"));   // 0
System.out.println(list.indexOf("Spring")); // -1

int lastIndexOf(Object o)

返回指定元素最后一次出现的下标;如果不存在,返回 -1

java
int lastIndexOf(Object o);
java
List<String> list = List.of("Java", "Python", "Java");

System.out.println(list.lastIndexOf("Java")); // 2

List<E> subList(int fromIndex, int toIndex)

截取子列表,范围是左闭右开,即 [fromIndex, toIndex)

java
List<E> subList(int fromIndex, int toIndex);
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Go");
list.add("C++");

List<String> sub = list.subList(1, 3);
System.out.println(sub); // [Python, Go]