ArrayList vs LinkedList,HashMap vs TreeMap:如何選擇最適合的集合類?

精心整理了最新的面試資料和簡歷模板,有需要的可以自行獲取

點擊前往百度網盤獲取
點擊前往夸克網盤獲取


在 Java 開發中,集合類的選擇直接影響程序的性能和代碼的可維護性。不同的數據結構適用于不同的場景,盲目使用可能導致內存浪費、性能下降甚至邏輯錯誤。本文將從底層原理、時間復雜度、內存占用和典型場景出發,對比分析 ArrayList vs LinkedListHashMap vs TreeMap,幫助你做出合理選擇。


一、ArrayList vs LinkedList:線性結構的對決
1. 底層數據結構
  • ArrayList:基于動態數組實現,內存連續分配。
  • LinkedList:基于雙向鏈表實現,節點通過指針連接。
2. 時間復雜度對比
操作ArrayListLinkedList
隨機訪問(get)O(1)O(n)
頭部插入/刪除O(n)(需移動元素)O(1)
尾部插入/刪除O(1)(均攤時間)O(1)
中間插入/刪除O(n)O(n)(需遍歷到位置)
3. 內存占用
  • ArrayList:內存緊湊,僅存儲數據和容量字段。但可能存在預分配空間(默認擴容為原容量的 1.5 倍)。
  • LinkedList:每個節點需額外存儲前驅和后繼指針,內存占用約為 ArrayList 的 2 倍。
4. 適用場景
  • 選擇 ArrayList
    • 需要頻繁隨機訪問元素(如按索引查詢)。
    • 尾部插入/刪除操作較多(如棧或隊列場景)。
    • 內存敏感,需減少空間碎片。
  • 選擇 LinkedList
    • 頻繁在頭部或中間插入/刪除(如實現隊列或雙向隊列)。
    • 無需隨機訪問,僅需順序遍歷(如迭代器遍歷)。
5. 誤區與注意事項
  • “LinkedList 插入一定比 ArrayList 快”:實際在中間插入時,LinkedList 需要遍歷到目標位置,耗時可能超過 ArrayList 的元素移動。
  • 內存局部性:ArrayList 的連續內存對 CPU 緩存更友好,遍歷速度更快。

二、HashMap vs TreeMap:鍵值對的兩種哲學
1. 底層數據結構
  • HashMap:基于哈希表(數組 + 鏈表/紅黑樹,Java 8 優化)。
  • TreeMap:基于紅黑樹(平衡二叉搜索樹)。
2. 時間復雜度對比
操作HashMap(平均)TreeMap
插入(put)O(1)O(log n)
查詢(get)O(1)O(log n)
范圍查詢(如子圖)不支持O(log n + k)
3. 核心特性
  • HashMap
    • 無序存儲,鍵的哈希值決定位置。
    • 允許 null 鍵和 null 值。
    • 負載因子(默認 0.75)控制擴容閾值。
  • TreeMap
    • 按鍵的自然順序或自定義 Comparator 排序。
    • 支持范圍查詢(如 subMap()tailMap())。
    • 鍵不可為 null(依賴比較邏輯)。
4. 適用場景
  • 選擇 HashMap
    • 需要快速存取鍵值對,且不關心順序。
    • 數據量大且哈希沖突較少(合理設計哈希函數)。
    • 允許 null 鍵值。
  • 選擇 TreeMap
    • 需要按順序遍歷鍵(如按字母序輸出)。
    • 頻繁執行范圍查詢(如查找 10~20 之間的鍵)。
    • 需自定義排序規則(如按對象屬性排序)。
5. 誤區與注意事項
  • 哈希沖突:HashMap 在哈希沖突嚴重時,鏈表會轉為紅黑樹(Java 8+),但仍需設計良好的哈希函數。
  • 線程安全:二者均非線程安全,多線程場景需用 ConcurrentHashMapCollections.synchronizedMap

三、綜合選擇策略
  1. 根據操作類型選擇

    • 頻繁隨機訪問 → ArrayList
    • 頻繁插入刪除 → 根據位置選擇 LinkedListArrayList
    • 需要排序 → TreeMap
    • 純鍵值存取 → HashMap
  2. 根據數據規模選擇

    • 小數據量:結構差異對性能影響較小,優先考慮代碼可讀性。
    • 大數據量:關注時間復雜度,避免線性操作(如 LinkedList 的遍歷)。
  3. 通過性能測試驗證:理論分析需結合實際場景測試(如 JMH 基準測試)。


四、總結
  • ArrayList:隨機訪問之王,尾部操作高效,內存友好。
  • LinkedList:頭尾插入刪除利器,但慎用于遍歷和中間操作。
  • HashMap:快速鍵值存取,無序場景首選。
  • TreeMap:有序鍵值對的終極選擇,支持復雜查詢。

最終,選擇集合類時需明確需求:是更關注速度、內存,還是功能特性?理解底層原理,結合實際場景,才能寫出高效健壯的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75915.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型訓練顯存壓縮實戰:ZeRO-3 vs 梯度累積 vs 量化混合策略

一、顯存瓶頸的本質與挑戰 大模型訓練面臨的核心矛盾是模型參數量指數級增長與GPU顯存容量線性提升之間的鴻溝。以175B參數模型為例,其顯存消耗主要來自三個方面: 參數存儲?:FP32精度下需700GB顯存?梯度緩存?:反向傳播產生的…

邊緣計算與隱私計算的融合:構建數據經濟的“隱形護盾“

在數據成為核心生產要素的今天,邊緣計算與隱私計算的交匯正在重塑技術生態。這并非簡單的技術疊加,而是一場關于數據主權、算力分配與信任機制的深度博弈。本文將從"數據流動的拓撲學"視角,探討二者融合如何重構數字社會的基礎設施…

Obsidian 文件夾體系構建 -INKA

Obsidian 文件夾體系構建 -INKA 本篇文章主要分享一下自己折騰學習實踐過的 INKA 框架方法。原地址:Obsidian文件夾體系構建–INKA。 文章目錄 Obsidian 文件夾體系構建 -INKA前言INKA簡介INKA 理論最佳實踐實際應用 反思 前言 上文 Obsidian文件夾體系構建-ACCES…

ocr-不動產權識別

目錄 一、在阿里云申請ocr識別服務 二、創建springboot項目 三、后續 一、在阿里云申請ocr識別服務 在線體驗:房產證圖片上傳 [阿里官方]不動產權證OCR文字識別_API專區_云市場-阿里云 (aliyun.com) 可以選擇一毛500次這個 當然也可以白嫖100 下面有個在線調試…

LeetCode算法題(Go語言實現)_47

題目 給你一個 m x n 的迷宮矩陣 maze (下標從 0 開始),矩陣中有空格子(用 ‘.’ 表示)和墻(用 ‘’ 表示)。同時給你迷宮的入口 entrance ,用 entrance [entrancerow, entrancecol…

The Strict Teacher (Hard Version) 去除無效的干擾!巧妙轉化

文章目錄 The Strict Teacher (Hard Version) 思考問題!那么多個人抓一個人,是否是每一個人都是對于最優策略的答案是有貢獻的?答案是否定的,其實問題可以簡化為三種情況: 所有的老師都在大衛的右邊,…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文閱讀

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的強化學習:機遇與挑戰 摘要 本綜述文章源自作者在 Educational Data Mining (EDM) 2021 會議期間組織的 RL4ED 研討會。我們組織了這一研討會,作為一項社區建設工作的組…

idea的快捷鍵使用以及相關設置

文章目錄 快捷鍵常用設置 快捷鍵 快捷鍵作用ctrlshift/注釋選中內容Ctrl /注釋一行/** Enter文檔注釋ALT SHIFT ↑, ALT SHIFT ↓上下移動當前代碼Ctrl ALT L格式化代碼Ctrl X刪除所在行并復制該行Ctrl D復制當前行數據到下一行main/psvm快速生成入口程序soutSystem.o…

代碼隨想錄算法訓練營Day30

力扣452.用最少數量的箭引爆氣球【medium】 力扣435.無重疊區間【medium】 力扣763.劃分字母區間【medium】 力扣56.合并區間【medium】 一、力扣452.用最少數量的箭引爆氣球【medium】 題目鏈接:力扣452.用最少數量的箭引爆氣球 視頻鏈接:代碼隨想錄 題…

Swift —— delegate 設計模式

一、什么是 delegate 模式 所謂 delegate 就是代理模式。簡單來說,delegate 模式就是在類的函數里運行完一段代碼后,你可以通過一個符合某個代理協議的屬性來調代理的方法。其中,代理方法就是回調函數。 二、delegate 模式與閉包比的優勢 …

linux-vi和文件操作

在 Linux 系統的世界里,有一個核心思想貫穿始終,那就是 “萬物都是文件”。這一理念極大地簡化了系統資源的管理和操作,為用戶和開發者提供了統一且高效的交互方式。本文將深入探討這一理念在 Linux 文件系統中的具體體現,從硬盤分…

Endnote 21顯示字段設置與修改詳細解析(附Endnote Click)

目錄 前言字段設置與詳細解釋Endnote Click1. 安裝 Endnote Click2. 一鍵獲取Edge插件3. 安裝完成啟動插件4. 檢索期刊文獻案例5. 在 Endnote Click 我的locker中導入文獻 前言 在學術研究的漫漫征途中,高效管理參考文獻是每位學者、學生都繞不開的關鍵環節。Endno…

java使用 ?Stream 流對自定義對象數組去重的

在 Java 中,使用 Stream 流對自定義對象數組去重的核心是確保對象能正確判斷“重復”的邏輯。以下是具體實現方法及場景分析: 方法 1:直接使用 distinct()(需重寫 equals 和 hashCode) 若自定義對象已正確重寫 equals…

C++ (類的設計,對象的創建,this指針,構造函數)

類的設計 C對結構體是有增強的 可以包含函數作為結構體成員 可以直接定義變量 在結構體成員函數里面可以直接訪問結構體成員變量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文閱讀

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文閱讀 提升語言模型中的數學推理能力:問題求解數據、數據合成方法及訓練階段的影響 \begin{abstract} 數學推…

網絡測試工具:涵蓋網絡測速、密碼查看、故障判斷與網絡監測

在網絡管理與維護的廣闊領域中,網絡測試工具扮演著至關重要的角色。它們不僅簡化了復雜的網絡診斷流程,還提升了工作效率。今天推薦一款包含功能全面的網絡測試工具:InetTest,是一款免費且開源的網絡測試工具,適用于Wi…

小剛說C語言刷題——1005 - 已知一個圓的半徑,求解該圓的面積和周長

1.題目描述 已知一個圓的半徑,求解該圓的面積和周長。 輸入 輸入只有一行,只有 1個整數。 輸出 輸出只有兩行,一行面積,一行周長。(保留兩位小數)。 令 pi3.1415926。 樣例 輸入 1 輸出 3.14 6.…

【算法】快速排序

算法系列六:快速排序 一、快速排序的遞歸探尋 1.思路 2.書寫 3.搭建 3.1設計過掉不符情況(在最底層時) 3.2查驗能實現基礎結果(在最底層往上點時) 3.3跳轉結果繼續往上回搭 4.實質 二、快速排序里的基準排序 …

SoapUI 4.6.4(32位)下載安裝教程 - 兼容老舊Windows系統

SoapUI 4.6.4(32位版) 是個老版本的測試工具,專門給 32位 Windows 電腦 用的。現在最新版都是 64 位的了,但如果你還在用老系統,可能還得找這個舊版。 SoapUI 4.6.4工具下載:https://pan.quark.cn/s/c07381db8102 這…

【AI量化第24篇】KhQuant 策略框架深度解析:讓策略開發回歸本質——基于miniQMT的量化交易回測系統開發實記

我是Mr.看海,我在嘗試用信號處理的知識積累和思考方式做量化交易,應用深度學習和AI實現股票自動交易,目的是實現財務自由~ 目前我正在開發基于miniQMT的量化交易系統——看海量化交易系統。 本篇要講到量化的核心了——策略。說白了每個投資者…