跳转至

List集合

List是Java中最常用的集合类型之一,它是一个有序的集合,允许存储重复元素,并且可以通过索引访问元素。

作用

List集合在实际开发中具有以下重要价值:

  1. 有序性:维护元素的插入顺序,便于按序访问
  2. 索引访问:支持通过索引快速访问元素
  3. 动态扩容:自动管理容量,无需手动调整大小
  4. 重复元素:允许存储重复数据,适应更多场景
  5. 丰富API:提供大量便捷的操作方法

详细说明

  1. ArrayList实现原理:

    • 基于动态数组实现
    • 初始容量为10
    • 扩容时容量翻倍
    • 适合随机访问,不适合频繁插入删除
  2. LinkedList实现原理:

    • 基于双向链表实现
    • 每个节点包含前后引用
    • 适合频繁插入删除
    • 不适合随机访问

图表说明

内存结构

插入操作

删除操作

例子

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        // ArrayList示例
        List<String> arrayList = new ArrayList<>();
        arrayList.add("Java");
        arrayList.add("Python");
        arrayList.add("C++");

        System.out.println("ArrayList:");
        for(String lang : arrayList) {
            System.out.println(lang);
        }

        // LinkedList示例
        List<Integer> linkedList = new LinkedList<>();
        linkedList.add(10);
        linkedList.add(20);
        linkedList.add(1, 15); // 在索引1插入元素

        System.out.println("LinkedList:");
        for(int i = 0; i < linkedList.size(); i++) {
            System.out.println("索引" + i + ": " + linkedList.get(i));
        }

        // 常用方法
        System.out.println("包含Java吗? " + arrayList.contains("Java"));
        System.out.println("Python的索引: " + arrayList.indexOf("Python"));
        arrayList.remove("C++");
        System.out.println("删除后大小: " + arrayList.size());

        // 删除操作示例
        System.out.println("=== 删除操作示例 ===");

        // ArrayList删除操作
        List<String> arrayList2 = new ArrayList<>();
        arrayList2.add("Hello");
        arrayList2.add("张三");
        arrayList2.add("World");

        System.out.println("ArrayList删除前: " + arrayList2);
        arrayList2.remove(1); // 删除索引1的元素
        System.out.println("ArrayList删除后: " + arrayList2);

        // LinkedList删除操作
        List<String> linkedList2 = new LinkedList<>();
        linkedList2.add("Hello");
        linkedList2.add("张三");
        linkedList2.add("World");

        System.out.println("LinkedList删除前: " + linkedList2);
        linkedList2.remove(1); // 删除索引1的元素
        System.out.println("LinkedList删除后: " + linkedList2);

        // 删除操作的性能对比
        System.out.println("=== 删除操作性能对比 ===");
        List<Integer> arrayList3 = new ArrayList<>();
        List<Integer> linkedList3 = new LinkedList<>();

        // 初始化数据
        for(int i = 0; i < 100000; i++) {
            arrayList3.add(i);
            linkedList3.add(i);
        }

        // 测试ArrayList删除性能
        long startTime = System.nanoTime();
        arrayList3.remove(50000); // 删除中间元素
        long arrayListTime = System.nanoTime() - startTime;

        // 测试LinkedList删除性能
        startTime = System.nanoTime();
        linkedList3.remove(50000); // 删除中间元素
        long linkedListTime = System.nanoTime() - startTime;

        System.out.println("ArrayList删除耗时: " + arrayListTime/1000000.0 + "ms");
        System.out.println("LinkedList删除耗时: " + linkedListTime/1000000.0 + "ms");
    }
}

执行结果

ArrayList:
Java
Python
C++
LinkedList:
索引0: 10
索引1: 15
索引2: 20
包含Java吗? true
Python的索引: 1
删除后大小: 2
=== 删除操作示例 ===
ArrayList删除前: [Hello, 张三, World]
ArrayList删除后: [Hello, World]
LinkedList删除前: [Hello, 张三, World]
LinkedList删除后: [Hello, World]
=== 删除操作性能对比 ===
ArrayList删除耗时: 0.009166ms
LinkedList删除耗时: 1.473583ms

注意事项

  1. ArrayList扩容会导致性能开销,初始化时可预估大小
  2. LinkedList每个元素需要额外存储前后节点引用,内存占用更大
  3. 遍历ArrayList时,随机访问比迭代器更快
  4. 遍历LinkedList时,一定要使用迭代器,不要用get(index)
  5. 多线程环境下考虑使用Collections.synchronizedList或CopyOnWriteArrayList