Skip to content

ListDemo

文件信息

  • 📄 原文件:ListDemo.java
  • 🔤 语言:java

Java List 集合 本文件介绍 Java 中的 List 接口及其实现类。

完整代码

java
import java.util.*;

/**
 * ============================================================
 *                    Java List 集合
 * ============================================================
 * 本文件介绍 Java 中的 List 接口及其实现类。
 * ============================================================
 */
public class ListDemo {

    public static void main(String[] args) {
        arrayListDemo();
        linkedListDemo();
        listOperations();
        listIteration();
        listSorting();
        immutableLists();
    }

    /**
     * ============================================================
     *                    1. ArrayList
     * ============================================================
     */
    public static void arrayListDemo() {
        System.out.println("=".repeat(60));
        System.out.println("1. ArrayList");
        System.out.println("=".repeat(60));

        // 【创建 ArrayList】
        List<String> list1 = new ArrayList<>();           // 推荐
        ArrayList<String> list2 = new ArrayList<>();      // 可以
        List<String> list3 = new ArrayList<>(100);        // 指定初始容量
        List<String> list4 = new ArrayList<>(Arrays.asList("a", "b", "c"));

        System.out.println("创建方式:");
        System.out.println("  new ArrayList<>(): " + list1);
        System.out.println("  带初始值: " + list4);

        // 【添加元素】
        System.out.println("\n--- 添加元素 ---");
        list1.add("Apple");           // 末尾添加
        list1.add("Banana");
        list1.add(1, "Cherry");       // 指定位置插入
        list1.addAll(Arrays.asList("Date", "Elderberry"));  // 添加多个
        System.out.println("添加后: " + list1);

        // 【访问元素】
        System.out.println("\n--- 访问元素 ---");
        System.out.println("get(0): " + list1.get(0));
        System.out.println("get(2): " + list1.get(2));
        System.out.println("size(): " + list1.size());
        System.out.println("isEmpty(): " + list1.isEmpty());

        // 【修改元素】
        System.out.println("\n--- 修改元素 ---");
        list1.set(0, "Apricot");
        System.out.println("set(0, \"Apricot\"): " + list1);

        // 【删除元素】
        System.out.println("\n--- 删除元素 ---");
        list1.remove(0);              // 按索引删除
        System.out.println("remove(0): " + list1);
        list1.remove("Banana");       // 按对象删除
        System.out.println("remove(\"Banana\"): " + list1);

        // 【查找元素】
        System.out.println("\n--- 查找元素 ---");
        System.out.println("contains(\"Cherry\"): " + list1.contains("Cherry"));
        System.out.println("indexOf(\"Cherry\"): " + list1.indexOf("Cherry"));
        System.out.println("lastIndexOf(\"Date\"): " + list1.lastIndexOf("Date"));

        // 【ArrayList 特性】
        System.out.println("\n【ArrayList 特性】");
        System.out.println("  - 基于动态数组实现");
        System.out.println("  - 随机访问快 O(1)");
        System.out.println("  - 插入删除慢 O(n)(需要移动元素)");
        System.out.println("  - 非线程安全");
    }

    /**
     * ============================================================
     *                    2. LinkedList
     * ============================================================
     */
    public static void linkedListDemo() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("2. LinkedList");
        System.out.println("=".repeat(60));

        // LinkedList 实现了 List 和 Deque 接口
        LinkedList<String> list = new LinkedList<>();

        // 【List 操作】
        list.add("A");
        list.add("B");
        list.add("C");
        System.out.println("List 操作: " + list);

        // 【Deque 操作】双端队列
        System.out.println("\n--- 双端队列操作 ---");
        list.addFirst("First");       // 头部添加
        list.addLast("Last");         // 尾部添加
        System.out.println("addFirst/Last: " + list);

        System.out.println("getFirst(): " + list.getFirst());
        System.out.println("getLast(): " + list.getLast());

        list.removeFirst();
        list.removeLast();
        System.out.println("removeFirst/Last: " + list);

        // 【栈操作】
        System.out.println("\n--- 栈操作 ---");
        LinkedList<Integer> stack = new LinkedList<>();
        stack.push(1);  // 等同于 addFirst
        stack.push(2);
        stack.push(3);
        System.out.println("push 1,2,3: " + stack);
        System.out.println("pop(): " + stack.pop());
        System.out.println("peek(): " + stack.peek());
        System.out.println("栈内容: " + stack);

        // 【队列操作】
        System.out.println("\n--- 队列操作 ---");
        LinkedList<Integer> queue = new LinkedList<>();
        queue.offer(1);  // 入队
        queue.offer(2);
        queue.offer(3);
        System.out.println("offer 1,2,3: " + queue);
        System.out.println("poll(): " + queue.poll());  // 出队
        System.out.println("peek(): " + queue.peek());
        System.out.println("队列内容: " + queue);

        // 【LinkedList 特性】
        System.out.println("\n【LinkedList 特性】");
        System.out.println("  - 基于双向链表实现");
        System.out.println("  - 随机访问慢 O(n)");
        System.out.println("  - 插入删除快 O(1)(已知位置时)");
        System.out.println("  - 可作为栈、队列、双端队列使用");
    }

    /**
     * ============================================================
     *                    3. List 常用操作
     * ============================================================
     */
    public static void listOperations() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("3. List 常用操作");
        System.out.println("=".repeat(60));

        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

        // 【子列表】
        System.out.println("--- 子列表 ---");
        List<Integer> subList = list.subList(1, 4);
        System.out.println("原列表: " + list);
        System.out.println("subList(1, 4): " + subList);

        // 【注意】子列表是视图,修改会影响原列表
        subList.set(0, 100);
        System.out.println("修改子列表后原列表: " + list);

        // 【转换为数组】
        System.out.println("\n--- 转换为数组 ---");
        list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        Integer[] arr = list.toArray(new Integer[0]);
        System.out.println("toArray: " + Arrays.toString(arr));

        // 【批量操作】
        System.out.println("\n--- 批量操作 ---");
        List<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));
        System.out.println("list: " + list);
        System.out.println("list2: " + list2);

        // 保留交集
        List<Integer> intersection = new ArrayList<>(list);
        intersection.retainAll(list2);
        System.out.println("retainAll (交集): " + intersection);

        // 删除交集
        List<Integer> difference = new ArrayList<>(list);
        difference.removeAll(list2);
        System.out.println("removeAll (差集): " + difference);

        // 【replaceAll】替换所有元素
        System.out.println("\n--- replaceAll ---");
        List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        numbers.replaceAll(n -> n * 2);
        System.out.println("replaceAll(n -> n * 2): " + numbers);

        // 【removeIf】条件删除
        System.out.println("\n--- removeIf ---");
        numbers.removeIf(n -> n > 6);
        System.out.println("removeIf(n -> n > 6): " + numbers);
    }

    /**
     * ============================================================
     *                    4. List 遍历
     * ============================================================
     */
    public static void listIteration() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("4. List 遍历");
        System.out.println("=".repeat(60));

        List<String> list = Arrays.asList("A", "B", "C", "D", "E");

        // 【for 循环】
        System.out.println("--- for 循环 ---");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();

        // 【增强 for 循环】
        System.out.println("\n--- 增强 for 循环 ---");
        for (String s : list) {
            System.out.print(s + " ");
        }
        System.out.println();

        // 【Iterator】
        System.out.println("\n--- Iterator ---");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
        System.out.println();

        // 【ListIterator】支持双向遍历
        System.out.println("\n--- ListIterator(反向)---");
        ListIterator<String> lit = list.listIterator(list.size());
        while (lit.hasPrevious()) {
            System.out.print(lit.previous() + " ");
        }
        System.out.println();

        // 【forEach】
        System.out.println("\n--- forEach ---");
        list.forEach(s -> System.out.print(s + " "));
        System.out.println();

        // 【Stream】
        System.out.println("\n--- Stream ---");
        list.stream().forEach(s -> System.out.print(s + " "));
        System.out.println();

        // 【遍历时删除】
        System.out.println("\n--- 遍历时删除(使用 Iterator)---");
        List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        Iterator<Integer> iter = numbers.iterator();
        while (iter.hasNext()) {
            if (iter.next() % 2 == 0) {
                iter.remove();  // 安全删除
            }
        }
        System.out.println("删除偶数后: " + numbers);
    }

    /**
     * ============================================================
     *                    5. List 排序
     * ============================================================
     */
    public static void listSorting() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("5. List 排序");
        System.out.println("=".repeat(60));

        // 【自然排序】
        System.out.println("--- 自然排序 ---");
        List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 2, 8, 1, 9, 3));
        Collections.sort(numbers);
        System.out.println("升序: " + numbers);

        Collections.sort(numbers, Collections.reverseOrder());
        System.out.println("降序: " + numbers);

        // 【List.sort()】Java 8+
        System.out.println("\n--- List.sort() ---");
        numbers.sort(Comparator.naturalOrder());
        System.out.println("自然顺序: " + numbers);

        numbers.sort(Comparator.reverseOrder());
        System.out.println("反向顺序: " + numbers);

        // 【自定义排序】
        System.out.println("\n--- 自定义排序 ---");
        List<String> words = new ArrayList<>(Arrays.asList("banana", "Apple", "cherry", "date"));

        // 按长度排序
        words.sort(Comparator.comparingInt(String::length));
        System.out.println("按长度: " + words);

        // 忽略大小写排序
        words.sort(String.CASE_INSENSITIVE_ORDER);
        System.out.println("忽略大小写: " + words);

        // 【对象排序】
        System.out.println("\n--- 对象排序 ---");
        List<Person2> people = new ArrayList<>();
        people.add(new Person2("Alice", 30));
        people.add(new Person2("Bob", 25));
        people.add(new Person2("Charlie", 35));

        // 按年龄排序
        people.sort(Comparator.comparingInt(Person2::getAge));
        System.out.println("按年龄: " + people);

        // 按名字排序
        people.sort(Comparator.comparing(Person2::getName));
        System.out.println("按名字: " + people);

        // 多级排序
        people.sort(Comparator
                .comparingInt(Person2::getAge)
                .thenComparing(Person2::getName));
        System.out.println("先年龄后名字: " + people);

        // 【其他工具方法】
        System.out.println("\n--- 其他工具方法 ---");
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        Collections.shuffle(list);       // 随机打乱
        System.out.println("shuffle: " + list);

        Collections.reverse(list);       // 反转
        System.out.println("reverse: " + list);

        Collections.rotate(list, 2);     // 旋转
        System.out.println("rotate(2): " + list);

        Collections.swap(list, 0, 4);    // 交换
        System.out.println("swap(0, 4): " + list);
    }

    /**
     * ============================================================
     *                    6. 不可变 List
     * ============================================================
     */
    public static void immutableLists() {
        System.out.println("\n" + "=".repeat(60));
        System.out.println("6. 不可变 List");
        System.out.println("=".repeat(60));

        // 【Arrays.asList】固定大小
        System.out.println("--- Arrays.asList ---");
        List<String> list1 = Arrays.asList("A", "B", "C");
        System.out.println("Arrays.asList: " + list1);
        list1.set(0, "X");  // 可以修改
        System.out.println("set(0, \"X\"): " + list1);
        // list1.add("D");  // 不能添加!UnsupportedOperationException

        // 【List.of】完全不可变(Java 9+)
        System.out.println("\n--- List.of (Java 9+) ---");
        List<String> list2 = List.of("A", "B", "C");
        System.out.println("List.of: " + list2);
        // list2.set(0, "X");  // 不能修改!
        // list2.add("D");     // 不能添加!

        // 【Collections.unmodifiableList】包装为不可变
        System.out.println("\n--- Collections.unmodifiableList ---");
        List<String> mutable = new ArrayList<>(Arrays.asList("A", "B", "C"));
        List<String> immutable = Collections.unmodifiableList(mutable);
        // immutable.add("D");  // 不能修改!

        // 【注意】底层列表的修改会反映到不可变视图
        mutable.add("D");
        System.out.println("底层修改后: " + immutable);

        // 【List.copyOf】真正的副本(Java 10+)
        System.out.println("\n--- List.copyOf (Java 10+) ---");
        List<String> copy = List.copyOf(mutable);
        mutable.add("E");
        System.out.println("原列表: " + mutable);
        System.out.println("copyOf: " + copy);  // 不受影响
    }
}

// 辅助类
class Person2 {
    private String name;
    private int age;

    public Person2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }

    @Override
    public String toString() {
        return name + "(" + age + ")";
    }
}

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布