首页 > 编程笔记 > Java笔记 阅读:11

Java List接口用法详解(附带实例)

List 是 Java 集合框架中使用频率比较高的一个接口,它的特点是存储的数据是有序的并且数据是可以重复的。

List 接口中定义了一系列方法来处理集合中的数据,包含添加、修改、删除、遍历等操作。它的常用实现类有 ArrayList 类和 LinkedList 类。

List 是有序的 Collection,有序表示 List 中元素的存入和取出顺序保持一致,每一个元素都有一个索引位置来存放。使用 List 能够通过索引来访问集合中的指定位置的元素。另外,List 中的元素是可重复的。

List 接口继承 Collection 接口,并在 Collection 接口的基础上进行了扩充,拥有了比 Collection 接口更多的方法。这里给出了 List 接口的一些方法,如下表所示。

表:List 接口的常用方法
方法 方法描述
void add(int index, Object o) 将 o 元素插入 List 集合中指定的 index 位置
boolean addAll(int index, Collection c) 在 index 位置插入 Collection 集合中的所有元素,如果添加后当前集合有变化则返回 true
Object get(int index) 获取 index 位置的元素
Object set(int index, Object o) 将 index 位置的元素替换为 o
Object remove(int index) 删除 index 位置的元素,并将删除的元素返回
int indexOf(Object o) 返回指定元素在 List 集合中首次出现时的索引,如果 List 集合不包含该元素则返回-1

List 接口有两个常用的实现类:ArrayList 和 LinkedList。ArrayList 以动态数组的方式实现 List 接口,而 LinkedList 以循环双链表的方式实现List接口,下面将分别讲解这两个实现类。

Java ArrayList集合

ArrayList 是 List 接口的实现类,它内部是基于数组实现的,从 Collection 和 List 集合继承了很多方法,能够实现元素的添加、删除、修改和遍历等功能,可以通过 add(Object obj) 方法实现元素的添加,通过 get(int index) 方法实现元素的获取。

接下来,通过案例来演示 ArrayList 的基本使用:
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        List carList = new ArrayList();    // 创建ArrayList集合
        carList.add("保时捷");
        carList.add("兰博基尼");
        System.out.println("集合元素的个数:" + carList.size());
        System.out.println(carList.get(0));    // 获取并打印集合中索引为0的元素
    }
}
程序的运行结果如下:

集合元素的个数:2
保时捷

程序中先创建一个名字为 carList 的 ArrayList 集合,然后向 carList 中添加两个元素,接着调用 size() 方法输出 carList 集合中元素的个数,然后又通过 get() 方法得到集合中索引为 0 的元素,并打印出来。

需要注意的是,集合的索引下标从 0 开始,最大的索引下标是集合长度减 1,如果下标取值超出索引范围,则会发生 IndexOutOfBoundsException 异常。

ArrayList 通过自动扩容的机制实现容量的动态增加,底层是数组结构。因为底层是用数组实现的,所以 ArrayList 在插入和删除元素的时候处理效率不佳,因此不建议用 ArrayList 做大量增删操作。另外,由于 ArrayList 中的每个元素都有索引,所以元素查询效率很高,适合大量查询操作场景。

Java LinkedList集合

LinkedList 也是 List 接口的一个实现类。LinkedList 底层的数据结构基于双向循环链表,链表中的每个元素都会通过对象引用的方式存储它前面的元素和后面的元素,从而将所有元素连接在一起,形成双向链表结构。

在插入和删除元素时,只要修改前后两个关联的节点的对象引用关系即可完成操作。因此,对于频繁的插入或删除元素的操作,建议使用 LinkedList 类,效率较高。

LinkedList 添加元素和删除元素的过程如下图所示:


图 1 双向链表结构图

其中,插入元素就是让前后两个元素都关联引用新元素,删除元素就是让前后两个元素直接相互关联。

LinkedList 除了具备 List 的所有功能外,它还实现了 Deque(双端队列)接口,可以在集合的头部和尾部进行元素的添加和删除。这里给出 LinkedList 的一些常用方法,如下表所示:

表:LinkedList 接口的常用方法
方法 方法描述
void add(int index,Object o) 在索引 index 的位置插入元素 o
void addFirst(Object o) 在集合的开头插入元素 o
void addLast(Object o) 在集合的结尾插入元素 o
Object getFirst() 获取集合的第 1 个元素
Object getLast() 获取集合的最后 1 个元素
Object removeFirst() 删除集合第 1 个元素并返回
Object removeLast() 删除集合最后 1 个元素并返回

接下来,通过案例来演示这些方法的使用:
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();    // 创建LinkedList集合
        linkedList.add("保时捷");
        linkedList.add("兰博基尼");
        System.out.println(linkedList);    // 打印集合中元素
        linkedList.addLast("林肯");
        linkedList.addFirst("布加迪");
        System.out.println(linkedList);    // 打印添加元素后的集合
        System.out.println(linkedList.removeLast());    // 删除并返回集合中最后一个元素
    }
}
程序的运行结果如下:

[保时捷, 兰博基尼, 劳斯莱斯]
[布加迪, 保时捷, 兰博基尼, 劳斯莱斯, 林肯]
林肯

程序中首先创建 LinkedList 集合对象,在集合中添加了 3 个元素,并打印输出。然后在集合尾部插入一个元素,接着在集合头部插入一个元素,打印输出集合内容,可以看出集合头部和尾部分别多出一个元素。最后删除集合尾部元素,并将删除的尾部元素打印出来。

相关文章