Java中的List接口(非常详细)
Java 中的 List 接口是 Collection 接口的子接口,实现一种顺序表的数据结构,有时也称为有序列表。
存放在 List 中的所有元素都有一个下标(从 0 开始),可以通过下标访问 List 中的元素。List 中可以包含重复元素。List 接口及其实现类的层次结构如下图所示。

图 1 List 接口及其实现类的层次结构
List 接口除了继承 Collection 的方法外,还定义了一些自己的方法。使用这些方法可以实现定位访问、查找、链式迭代和范围查看。
List 接口的定义如下:
ArrayList 类通过数组方式实现,相当于可变长度的数组。LinkedList 类则通过链表结构来实现。这两个类的实现方式不同,使得相关操作方法的代价也不同。一般说来,若对一个列表结构的开始和结束处有频繁地添加和删除操作时,选用 LinkedList 类所实例化的对象表示该列表。
ArrayList 类实际上实现了一个变长的数组,其元素可以动态地增加和删除。它的定位访问时间是常量时间。
ArrayList 类的构造方法如下:
【实例 1】创建一个 ArrayListDemo 类,在其中创建一个 ArrayList 类集合,向集合中添加元素,然后输出所有元素。
LinkedList 类的构造方法如下:
通常利用 LinkedList 类对象表示一个堆栈(stack)或队列(queue)。对此 LinkedList 类中特别定义了一些方法,而这是 ArrayList 类所不具备的。这些方法用于在列表的开始和结束处添加和删除元素,其方法定义如下:
【实例 2】创建类 LinkedListDemo,在其中创建一个 LinkedList 类集合,对其进行各种操作。
存放在 List 中的所有元素都有一个下标(从 0 开始),可以通过下标访问 List 中的元素。List 中可以包含重复元素。List 接口及其实现类的层次结构如下图所示。

图 1 List 接口及其实现类的层次结构
List 接口除了继承 Collection 的方法外,还定义了一些自己的方法。使用这些方法可以实现定位访问、查找、链式迭代和范围查看。
List 接口的定义如下:
public interface List<E> extends Collection<E> { // 定位访问 E get(int index); E set(int index, E element); boolean add(E element); void add(int index, E element); E remove(int index); abstract boolean addAll(int index, Collection<? extends E> c); // 查找 int indexOf(Object o); int lastIndexOf(Object o); // 迭代 ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); // 范围查看 List<E> subList(int from, int to); }在集合框架中,实现列表接口(List<E>)的是 ArrayList 类和 LinkedList 类。这两个类定义在 java.util 包中。
ArrayList 类通过数组方式实现,相当于可变长度的数组。LinkedList 类则通过链表结构来实现。这两个类的实现方式不同,使得相关操作方法的代价也不同。一般说来,若对一个列表结构的开始和结束处有频繁地添加和删除操作时,选用 LinkedList 类所实例化的对象表示该列表。
Java ArrayList类
ArrayList 类是最常用的实现类,通过数组实现的集合对象。ArrayList 类实际上实现了一个变长的数组,其元素可以动态地增加和删除。它的定位访问时间是常量时间。
ArrayList 类的构造方法如下:
- ArrayList(): 创建一个空的数组列表对象。
- ArrayList(Collection c): 用集合 c 中的元素创建一个数组列表对象。
- ArrayList(int initialCapacity): 创建一个空的数组列表对象,并指定初始容量。
【实例 1】创建一个 ArrayListDemo 类,在其中创建一个 ArrayList 类集合,向集合中添加元素,然后输出所有元素。
import java.util.*; public class ArrayListDem { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("collection"); list.add("list"); list.add("ArrayList"); list.add("LinkedList"); for (String s : list) System.out.println(s); list.set(3, "ArrayList"); System.out.println("修改下标为 3 的元素后,列表中元素为:"); for (String s : list) System.out.println(s); } }程序执行结果为:
collection list ArrayList LinkedList 修改下标为 3 的元素后,列表中元素为: collection list ArrayList ArrayList
Java LinkedList类
如果需要经常在 List 类接口的头部添加元素,在 List 类接口的内部删除元素,就应该考虑使用 LinkedList 类。这些操作在 LinkedList 类中是常量时间,在 ArrayList 类中是线性时间。但定位访问在 LinkedList 类中是线性时间,而在 ArrayList 类中是常量时间。LinkedList 类的构造方法如下:
- LinkedList(): 创建一个空的链表。
- LinkedList(Collection c): 用集合 c 中的元素创建一个链表。
通常利用 LinkedList 类对象表示一个堆栈(stack)或队列(queue)。对此 LinkedList 类中特别定义了一些方法,而这是 ArrayList 类所不具备的。这些方法用于在列表的开始和结束处添加和删除元素,其方法定义如下:
- public void addFirst(E element): 将指定元素插入此列表的开头;
- public void addLast(E element): 将指定元素添加到此列表的结尾;
- public E removeFirst(): 移除并返回此列表的第一个元素;
- public E removeLast(): 移除并返回此列表的最后一个元素。
【实例 2】创建类 LinkedListDemo,在其中创建一个 LinkedList 类集合,对其进行各种操作。
import java.util.LinkedList; public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> queue = new LinkedList<String>(); queue.addFirst("set"); queue.addLast("HashSet"); queue.addLast("TreeSet"); queue.addFirst("List"); queue.addLast("ArrayList"); queue.addLast("LinkedList"); queue.addLast("map"); queue.addFirst("collection"); System.out.println(queue); queue.removeLast(); queue.removeFirst(); System.out.println(queue); } }程序执行结果为:
[collection, List, set, HashSet, TreeSet, ArrayList, LinkedList, map] [List, set, HashSet, TreeSet, ArrayList, LinkedList]