首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 集合框架核心解析:ArrayList 與 LinkedList 深度對比

     編輯:Java 相關知識

前言

Java 集合框架提供了強大且靈活的容器機制,能夠高效解決大數據量存儲與操作的問題。本文將針對開發中最常用的 ArrayList 與 LinkedList 進行深度解析,並輔以實戰代碼示例,幫助開發者根據場景選擇最優方案。

一、ArrayList:隨機訪問的高手

ArrayList 底層基於動態數組實現,提供了極簡的 API:

  • add(E e):尾部插入元素,攤還時間複雜度 O(1)
  • get(int index):隨機訪問元素,時間複雜度 O(1)
  • size():獲取當前元素數量

優勢在於隨機訪問極快,適合「讀多寫少」且頻繁按索引查詢的場景。但因數組特性,在中間插入/刪除元素需移動後續元素,時間複雜度 O(n),性能較差。

實戰代碼示例

package holding;
import java.util.ArrayList;

public class AppleAndOrangesWithGenerics {
    public static void main(String[] args) {
        ArrayList<Apple> apples = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            apples.add(new Apple());
        }
        // 方式一:索引遍歷
        for (int i = 0; i < apples.size(); i++) {
            System.out.println(apples.get(i).id());
        }
        // 方式二:增強 for 循環(推薦)
        for (Apple apple : apples) {
            System.out.println(apple.id() + "-");
        }
    }
}

二、LinkedList:插入刪除的王者

LinkedList 基於雙向鏈表實現,同樣實現 List 接口,但性能特點截然不同:

  • 插入/刪除極快(只需修改指針),時間複雜度 O(1)
  • 隨機訪問較慢(需從頭/尾遍歷),時間複雜度 O(n)
  • 額外提供 addFirst、removeLast、offer、poll 等方法,天然支援堆疊、佇列、雙端佇列操作

實戰代碼示例

package holding;
import java.util.LinkedList;

public class LinkedListFeatures {
    public static void main(String[] args) {
        LinkedList<Pet> pets = new LinkedList<>(Pets.arrayList(5));
        System.out.println(pets);
        // 佇列操作示例
        System.out.println("pets.peek(): " + pets.peek());     // 查看隊首不移除
        System.out.println("pets.poll(): " + pets.poll());     // 取出並移除隊首
        System.out.println("pets.offer(Pets.randomPet()): " + pets.offer(Pets.randomPet())); // 尾部添加
        // 堆疊操作示例
        pets.addFirst(new Rat());
        pets.addLast(new Hamster());
    }
}

三、List 排序與查詢:Collections 工具類

對 List 進行排序、查詢時,使用 Collections 靜態方法替代數組的 Arrays 方法:

  • Collections.sort(list):自然順序排序
  • Collections.sort(list, Comparator):自定義比較器排序
  • Collections.binarySearch(list, key):二分查找(前提:列表已排序)
  • Collections.shuffle(list):隨機打亂順序

完整範例

package containers;
import java.util.*;

public class ListSortSearch {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Utilities.list);
        list.addAll(Utilities.list);
        Collections.shuffle(list, new Random(47));
        // 使用 ListIterator 從索引 10 開始移除後續元素
        ListIterator<String> it = list.listIterator(10);
        while (it.hasNext()) {
            it.next();
            it.remove();
        }
        Collections.sort(list);
        String key = list.get(7);
        int index = Collections.binarySearch(list, key);
        System.out.println("Location of " + key + " is " + index);
        // 忽略大小寫排序
        Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    }
}

四、核心選型建議

場景推薦容器理由
頻繁隨機訪問、末尾增刪ArrayListO(1) 訪問,尾部操作攤還 O(1)
頻繁頭部/中間增刪、佇列/堆疊LinkedListO(1) 插入刪除,原生支援 Deque
需排序、查詢、去重配合 Collections / Set工具類豐富,避免重複造輪子

總結:理解底層數據結構特性,根據業務訪問模式選擇容器,是寫出高性能 Java 代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved