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

Java集合框架核心:List與Set接口及實現類深度解析

     編輯:Java 相關知識

概述

Java集合框架(JCF)是處理對象組的統一架構。Java 2重寫了集合庫(由Joshua Bloch主導),提供豐富的接口與實現。集合分兩大體系:Collection(單一元素序列)與Map(鍵值對)。本文聚焦Collection下的兩大支柱——List(有序、可重複)與Set(無序、唯一),剖析其接口契約、核心實現類特性、迭代器模式及選型指南。

一、 迭代器模式:統一遍歷抽象

Iterator是輕量級對象,屏蔽底層數據結構差異,提供單向遍歷:

  • iterator():獲取迭代器,首次next()返回首元素
  • hasNext():判斷是否有下一元素
  • next():返回下一元素並移動游標
  • remove():刪除最近返回的元素(可選操作)

ListIterator專為List設計,雙向遍歷(hasPrevious()/previous())、支持插入(add())、修改(set())、獲取索引(nextIndex()/previousIndex()),功能更強。

二、 List接口與實現類詳解

1. List接口契約

核心特徵:保持插入順序、允許重複元素、支持索引訪問(get(index))、提供ListIterator。新增方法:add(index, E)、remove(index)、set(index, E)、subList(from, to)等。

2. ArrayList:動態數組

  • 底層:Object[] elementData,默認容量10,擴容1.5倍
  • 優勢:隨機訪問O(1)、遍歷快(CPU緩存友好)、記憶體開銷小
  • 劣勢:中間插入/刪除O(n)需移動元素、擴容拷貝開銷
  • 適用:讀多寫少、頻繁隨機訪問、作為緩存/列表展示

3. LinkedList:雙向鏈表

  • 底層:非循環雙向鏈表(Node節點含prev/next/item)
  • 優勢:首尾增刪O(1)、中間增刪僅需修改指針(定位仍O(n))、天然支持棧/隊列/雙端隊列(addFirst/Last、pollFirst/Last)
  • 劣勢:隨機訪問O(n)、節點額外記憶體開銷、非緩存友好
  • 適用:頻繁首尾操作、大量中間增刪(配合ListIterator)、實現隊列/棧

4. Vector與CopyOnWriteArrayList(補充)

Vector同步化、擴容2倍,已過時;CopyOnWriteArrayList寫時復制,讀無鎖,適合讀多寫少的併發場景。

三、 Set接口與實現類詳解

1. Set接口契約

核心特徵:元素唯一(依賴equals()判斷)、無序(除LinkedHashSet/TreeSet)、無索引訪問。存入對象必須正確重寫equals()與hashCode(),否則唯一性失效。

2. HashSet:哈希表

  • 底層:HashMap(值共用PRESENT常量)
  • 查找/插入/刪除平均O(1)
  • 無序、線程不安全
  • 要求元素實現良好的hashCode()分布

3. LinkedHashSet:有序哈希表

  • 繼承HashSet,內部維護雙向鏈表記錄插入順序
  • 迭代順序=插入順序,性能略低於HashSet
  • 適合需保持插入順序且要求唯一的場景

4. TreeSet:紅黑樹

  • 底層:TreeMap(紅黑自平衡BST)
  • 元素按自然頩序(Comparable)或比較器(Comparator)排序
  • 查找/插入/刪除O(log n)
  • 支持first()/last()/headSet()/tailSet()/subSet()範圍操作
  • 要求元素實現Comparable或提供Comparator

四、 選型決策指南

場景推薦實現理由
高頻隨機訪問、少量增刪ArrayListO(1)訪問、緩存友好
頻繁首尾/中間增刪、實現隊列棧LinkedListO(1)首尾操作、ListIterator高效修改
去重、高性能查找、無序要求HashSetO(1)平均性能
去重、保持插入順序LinkedHashSet有序+O(1)查找
去重、需排序/範圍查詢TreeSet有序+O(log n)範圍操作
併發讀多寫少列表CopyOnWriteArrayList讀無鎖、快照迭代器
併發SetConcurrentHashMap.newKeySet()高併發、弱一致性迭代器

五、 最佳實踐提醒

  1. 面向接口編程:聲明用List<T>/Set<T>,實例化具體實現,便於替換
  2. 指定初始容量:預估數據量時用new ArrayList<>(capacity)避免多次擴容
  3. 正確重寫equals/hashCode:自定義對象進Set/作Map鍵時必須遵循契約
  4. 避免在循環中修改集合:用Iterator.remove()或併發集合,否則拋ConcurrentModificationException
  5. 優先使用Collections工廠方法:Java 9+List.of()、Set.of()創建不可變集合

總結

List與Set分別解決「有序可重複」與「無序唯一」兩類核心需求。掌握各實現類的數據結構特性(動態數組vs鏈表vs哈希表vs紅黑樹)、時間複雜度、併發行為,結合業務訪問模式(讀寫比、順序要求、範圍查詢),方能做出最優選型。現代開發中,還應關注Stream API、不可變集合、併發集合等進階特性,編寫更簡潔、健壯、高效的代碼。

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