Java List 集合详解:基础用法、常见实现类与高频面试题解析

正文

在 Java 集合框架中,List 是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。


👉点击获取2024Java学习资料

1. 什么是 List?

List 是 Java 集合框架中的一个接口,它继承了 Collection 接口,用于存储一组有序的元素。与普通数组相比,List 提供了动态调整大小和丰富操作方法的功能。

特点

  1. 元素有序,可通过索引访问。
  2. 允许存储重复的元素。
  3. 可以存储 null 值。

常用实现类

  • ArrayList
  • LinkedList
  • Vector
  • CopyOnWriteArrayList(线程安全)

2. List 的基本操作

以下是 List 接口的一些常用方法:

方法 描述
add(E e) 在列表末尾添加元素
add(int index, E e) 在指定位置插入元素
get(int index) 根据索引获取元素
set(int index, E e) 修改指定索引的元素
remove(int index) 移除指定索引的元素
size() 返回列表中元素的数量
contains(Object o) 判断列表是否包含指定元素
indexOf(Object o) 返回元素的首次出现索引
isEmpty() 判断列表是否为空

代码示例

```java
import java.util.*;

public class ListDemo {
    public static void main(String[] args) {
        List list = new ArrayList<>();
        // 添加元素
        list.add("Java");
        list.add("Python");
        list.add("C++");

        // 插入元素
        list.add(1, "JavaScript");

        // 获取元素
        System.out.println("元素:" + list.get(1));

        // 修改元素
        list.set(2, "C#");

        // 删除元素
        list.remove(3);

        // 遍历列表
        for (String item : list) {
            System.out.println(item);
        }
    }
}
```

3. 常用的 List 实现类

3.1 ArrayList

ArrayList 是基于动态数组实现的列表,适合频繁查询的场景。

特点

  • 随机访问效率高。
  • 插入或删除时可能需要移动大量元素。
  • 非线程安全。

代码示例

```java
import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);

        System.out.println("ArrayList: " + numbers);
    }
}
```

3.2 LinkedList

LinkedList 是基于双向链表实现的列表,适合频繁插入和删除的场景。

特点

  • 查询效率较低,需要从头开始遍历。
  • 插入和删除效率高。
  • 可以用作队列(Queue)或双端队列(Deque)。

代码示例

```java
import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList queue = new LinkedList<>();
        queue.add("Alice");
        queue.add("Bob");
        queue.add("Charlie");

        System.out.println("LinkedList: " + queue);

        // 模拟队列操作
        System.out.println("Poll: " + queue.poll());  // 移除并返回队首元素
    }
}
```

3.3 Vector

Vector 是线程安全的动态数组,适合多线程场景。

特点

  • 每个方法都使用了同步机制。
  • 性能比 ArrayList 较低,但线程安全。

代码示例

```java
import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        Vector vector = new Vector<>();
        vector.add("Apple");
        vector.add("Banana");
        vector.add("Cherry");

        System.out.println("Vector: " + vector);
    }
}
```

3.4 CopyOnWriteArrayList

CopyOnWriteArrayList 是线程安全的 ArrayList 实现,适合多线程且读多写少的场景。

特点

  • 每次修改时都会复制底层数组。
  • 读操作不需要锁,性能高。
  • 写操作的性能较低。

代码示例

```java
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList list = new CopyOnWriteArrayList<>();
        list.add("Thread-safe");
        list.add("Example");

        System.out.println("CopyOnWriteArrayList: " + list);
    }
}
```

4. List 的扩展用法

4.1 排序操作

Collections.sort 方法可以对列表进行排序:

代码示例

```java
import java.util.*;

public class SortExample {
    public static void main(String[] args) {
        List numbers = Arrays.asList(5, 3, 8, 1);
        Collections.sort(numbers);
        System.out.println("排序后: " + numbers);
    }
}
```

4.2 遍历方式

  1. for-each 循环

    ```java
    

    for (String item : list) {
    System.out.println(item);
    }
    ```

  2. Iterator

    ```java
    

    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
    System.out.println(iterator.next());
    }
    ```

  3. Stream API

    ```java
    

    list.stream().forEach(System.out::println);
    ```

4.3 Stream 和 Lambda 表达式

利用 Stream 可以方便地对列表进行操作:

代码示例

```java
import java.util.*;

public class StreamExample {
    public static void main(String[] args) {
        List names = Arrays.asList("Alice", "Bob", "Charlie");
        names.stream()
             .filter(name -> name.startsWith("A"))
             .forEach(System.out::println);
    }
}
```

5. 面试中关于 List 的高频问题

  1. ArrayList 和 LinkedList 的区别

    • ArrayList 基于数组,查询快,插入和删除慢。
    • LinkedList 基于链表,插入和删除快,查询慢。
    • Vector 和 ArrayList 的区别

    • Vector 是线程安全的,ArrayList 是非线程安全的。

    • Vector 性能相对较低。
    • 线程安全的 List 实现有哪些?

    • Vector

    • CopyOnWriteArrayList
    • 如何避免 ConcurrentModificationException?

    • 使用 Iteratorremove 方法。

    • 使用线程安全的集合如 CopyOnWriteArrayList

6. 总结

List 是 Java 集合框架中非常重要的一部分,其各种实现类在不同的场景下各有优势。掌握 List 的基本用法和实现类的特性,不仅有助于日常开发,还能应对 Java 面试中的高频考察。

希望本文对你理解 List 及其常用扩展有所帮助!

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5121.html

(0)
LomuLomu
上一篇 2025 年 1 月 1 日 上午5:31
下一篇 2025 年 1 月 1 日 上午6:04

相关推荐

  • Mysql

    MySQL 学习整理 MySQL 基础架构 最上层的客户端所包含的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器工具或服务器都有类似的服务,包括连接处理、身份验证、确保安全性等。 第二层包含了大多数 MySQL 的核心功能,包括查询解析、分析、优化、以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能也都在这一层实现:…

    2024 年 12 月 28 日
    54100
  • 某滑块验证码识别思路(附完整代码)

    思路 验证码类型如下: 大概搜索了下,有两种主流思路:yolo目标检测算法和opencv模版匹配。很明显第二种成本远小于第一种,也不需要训练。 而且这种验证码有干扰(两个目标点),yolo一次还不能直接到位,还得进一步处理。我在搜索的时候还有用轮廓匹配做识别的,但是实测下来准确率很低,这里就不说了。 识别 背景预处理 先对图片做一些预处理,移除多余的干扰项,…

    2024 年 12 月 24 日
    56200
  • 使用Docker部署的基于binlog实现Mysql8

    概念 MySQL 基于 Binlog 的主从复制(Master-Slave Replication)是 MySQL 数据库中实现数据复制的一种机制。在这种复制模式下,主库(Master)记录所有对数据库的修改操作(如 INSERT、UPDATE、DELETE 等)到 二进制日志(Binlog) ,从库(Slave)则读取这些日志并执行相同的操作,从而保持与主…

    未分类 2025 年 1 月 11 日
    39900
  • 基于Redis有序集合实现滑动窗口限流

    滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间段内的请求次数。通过动态地滑动窗口,可以动态调整限流的速率,以应对不同的流量变化。 整个限流可以概括为两个主要步骤: 统计窗口内的请求数量 应用限流规则 Redis有序集合每个value有一个score(分数),基于score我们可以定义一个时间窗口,然后每次…

    2024 年 12 月 31 日
    55200
  • 深入解析 Java 多线程编程中的 Thread 类核心功能

    Java 平台的多线程编程能力主要依赖于 Thread 这个基础类。我们将全面剖析该类的重要特性与实用方法,并通过具体案例演示其应用场景。 一、线程的初始化与基础控制 在 Java 中,开发者可以通过以下两种主要途径创建新线程:1. #### 扩展 Thread 基类 class CustomThread extends Thread { public vo…

    2025 年 5 月 13 日
    41700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信