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]
ICP备案:
公安联网备案: