Java學習進階--集合體系結構

????????Java 集合框架 (java.util?包) 是 Java 中用于存儲和操作數據集合的核心組件,其設計精良、功能強大且高度靈活。理解其體系結構是 Java 進階的關鍵一步。

一.集合的核心思想

接口與實現分離

????????集合框架的核心在于接口定義了行為規范,而具體實現類提供了不同的底層數據結構和算法。應用程序應該面向0接口編程,這樣可以在不改變代碼邏輯的情況下更換實現,提高靈活性和可維護性。

集合框架的總體結構

Java 集合框架主要分為兩大分支:Collection?和?Map

  • Collection?接口:是單列集合的根接口,用于存儲單個元素。它有三個主要的子接口:ListSet?和?Queue
  • Map?接口:是雙列集合的根接口,用于存儲鍵值對。

二.Collection接口 --?單列集合

????????Collection是單列集合的祖宗接口,它的功能是全部的單列集合都可以繼承使用的,下圖是Collection接口下的繼承和實現關系。

List系列集合:添加的元素是有序,可重復,有索引

Set系列集合:添加的元素是無序,不重復,無索引

Collection中的方法:

1. 基本操作方法

方法描述返回值示例
boolean add(E e)添加元素成功返回 truelist.add("Java")
boolean remove(Object o)刪除指定元素存在并刪除返回 trueset.remove("Python")
int size()返回元素數量集合大小queue.size()
boolean isEmpty()檢查是否為空空集合返回 trueif (coll.isEmpty())
void clear()清空集合list.clear()

2. 批量操作方法

方法描述示例
boolean addAll(Collection<? extends E> c)添加另一個集合的所有元素list1.addAll(list2)
boolean removeAll(Collection<?> c)刪除指定集合中存在的所有元素set.removeAll(subset)
boolean retainAll(Collection<?> c)僅保留指定集合中的元素(求交集)list.retainAll(subList)
boolean containsAll(Collection<?> c)檢查是否包含指定集合的所有元素if (set.containsAll(subset))

3. 查詢方法

方法描述示例
boolean contains(Object o)檢查是否包含指定元素if (list.contains("Java"))
Object[] toArray()將集合轉為數組Object[] arr = coll.toArray()
<T> T[] toArray(T[] a)將集合轉為指定類型數組String[] arr = list.toArray(new String[0])

4. 迭代方法

方法描述示例
Iterator<E> iterator()返回迭代器Iterator<String> it = coll.iterator()
default void forEach(Consumer<? super T> action)使用函數式接口遍歷list.forEach(System.out::println)

5. Java 8 新增默認方法

方法描述示例
default boolean removeIf(Predicate<? super E> filter)刪除滿足條件的元素list.removeIf(s -> s.length() < 3)
default Spliterator<E> spliterator()返回可分割迭代器Spliterator<String> sp = coll.spliterator()
default Stream<E> stream()返回順序流coll.stream().filter(...)
default Stream<E> parallelStream()返回并行流coll.parallelStream().
import java.util.*;public class CollectionDemo {public static void main(String[] args) {// 1. 創建集合 (使用ArrayList實現)Collection<String> languages = new ArrayList<>();// 2. 添加元素languages.add("Java");languages.add("Python");languages.add("JavaScript");languages.add("C++");System.out.println("初始集合: " + languages); // [Java, Python, JavaScript, C++]// 3. 檢查元素是否存在System.out.println("包含Java? " + languages.contains("Java")); // true// 4. 刪除元素languages.remove("C++");System.out.println("刪除C++后: " + languages); // [Java, Python, JavaScript]// 5. 批量操作 - 添加另一個集合Collection<String> frontend = new HashSet<>();frontend.add("HTML");frontend.add("CSS");frontend.add("JavaScript");languages.addAll(frontend);System.out.println("添加前端技術后: " + languages); // [Java, Python, JavaScript, HTML, CSS]// 6. 批量操作 - 刪除另一個集合中的元素languages.removeAll(frontend);System.out.println("移除前端技術后: " + languages); // [Java, Python]// 7. 批量操作 - 保留交集Collection<String> popular = List.of("Java", "Python", "Go");languages.retainAll(popular);System.out.println("保留流行語言后: " + languages); // [Java, Python]// 8. 轉換為數組Object[] array = languages.toArray();System.out.println("數組內容: " + Arrays.toString(array)); // [Java, Python]// 9. 遍歷集合 - 迭代器System.out.print("迭代器遍歷: ");Iterator<String> it = languages.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}System.out.println(); // 迭代器遍歷: Java Python // 10. 遍歷集合 - forEach (Java 8+)System.out.print("forEach遍歷: ");languages.forEach(lang -> System.out.print(lang + " "));System.out.println(); // forEach遍歷: Java Python // 11. Java 8 新特性 - removeIflanguages.removeIf(lang -> lang.startsWith("P"));System.out.println("移除P開頭的語言后: " + languages); // [Java]// 12. Java 8 新特性 - streamlong count = languages.stream().filter(lang -> lang.length() > 3).count();System.out.println("長度大于3的元素數量: " + count); // 1 (Java)// 13. 清空集合languages.clear();System.out.println("清空后集合: " + languages); // []System.out.println("集合是否為空? " + languages.isEmpty()); // true}
}

三.Map?接口 --?雙列集合

1. “雙列集合”的含義

“雙列”:?指的是?Map?存儲的元素由兩個部分組成:

  • 鍵 (Key):?用于唯一標識元素的部分,相當于第一列。
  • 值 (Value):?與鍵相關聯的數據部分,相當于第二列。

“集合”:?指的是?Map?本身是一個容器,用于存儲和管理這些鍵值對 (Key-Value Pair) 元素。

2. Map 接口的核心概念

鍵值對 (Key-Value Pair):?這是?Map?存儲的基本單位。每個元素都是一個包含?Key?和?Value?的配對。

鍵 (Key) 的唯一性:?Map?中?不允許有重復的鍵。每個鍵最多只能映射到一個值。這是?Map?最重要的特性之一。

值 (Value) 的可重復性:?不同的鍵可以映射到相同的值。值可以重復。

映射關系 (Mapping):?Map?的核心功能就是建立?Key?到?Value?的映射關系。通過一個?Key,可以高效地查找到其對應的?Value。這就像一本字典(Dictionary)或電話簿,通過名字(Key)查找電話號碼(Value)。

無序性 (通常):?大多數?Map?實現類(如?HashMap不保證鍵值對的存儲順序(插入順序或自然順序)。但也有保證順序的實現(如?LinkedHashMap?保證插入順序,TreeMap?保證按鍵排序)。

不允許?null?(視實現而定):

  • HashMapLinkedHashMap?允許一個?null?鍵和多個?null?值。
  • TreeMap?不允許?null?鍵(因為要排序),值可以為?null
  • ConcurrentHashMap?不允許?null?鍵和?null?值。
  • Hashtable?不允許?null?鍵和?null?值。

3. 為什么需要 Map?解決了什么問題?

Map?解決了需要根據?唯一標識符?快速查找、添加、刪除或更新?關聯數據?的場景。例如:

  • 字典/電話簿:?根據單詞查釋義,根據姓名查電話。
  • 數據庫記錄緩存:?用主鍵?ID?作為?Key,緩存整個記錄對象作為?Value
  • 配置信息:?配置項名稱作為?Key,配置值作為?Value
  • 對象屬性映射:?屬性名作為?Key,屬性值作為?Value
  • 計數/統計:?用物品名稱作為?Key,物品數量作為?Value
  • 圖結構:?表示節點之間的連接關系(鄰接表)。
實現類描述鍵有序性允許?null?鍵/值底層實現
HashMap最常用。?基于哈希表實現,提供最快的查找速度(平均 O(1))。不保證?(通常無序)1個?null鍵, 多個?null數組 + 鏈表 / 紅黑樹 (JDK8+)
LinkedHashMap繼承?HashMap額外維護一個雙向鏈表,保證迭代順序 == 插入順序保證插入順序1個?null鍵, 多個?null哈希表 + 雙向鏈表
TreeMap基于?紅黑樹 (Red-Black Tree)?實現。保證鍵值對按鍵的自然順序或定制順序排序。保證鍵的排序順序鍵不能?null, 值可以紅黑樹
Hashtable古老的線程安全實現?(JDK 1.0)。不推薦使用,優先選?ConcurrentHashMap不保證鍵和值都不能?null哈希表
ConcurrentHashMap現代高效的線程安全實現?(JDK 5+)。支持高并發讀寫。不保證鍵和值都不能?null分段鎖 / CAS (JDK8+)
Properties繼承?Hashtable。專門處理?屬性配置文件?(key=value?格式如?.properties)。通常按文件加載順序鍵和值都不能?null哈希表

4. Map 接口的常用方法

增 / 改:

  • V put(K key, V value): 添加鍵值對。如果鍵已存在,則替換舊值并返回舊值;如果鍵不存在,添加并返回?null
  • void putAll(Map<? extends K, ? extends V> m): 將另一個?Map?的所有鍵值對添加到當前?Map

刪:

  • V remove(Object key): 根據鍵刪除鍵值對,返回被刪除的值。鍵不存在返回?null
  • void clear(): 清空所有鍵值對。

查:

  • V get(Object key): 根據鍵獲取對應的值。鍵不存在返回?null
  • boolean containsKey(Object key): 判斷是否包含指定的鍵。
  • boolean containsValue(Object value): 判斷是否包含指定的值(效率通常低于?containsKey)。

視圖獲取:

  • Set<K> keySet(): 返回此?Map?中所有鍵組成的?Set?集合(因為鍵唯一)。
  • Collection<V> values(): 返回此?Map?中所有值組成的?Collection?集合(值可以重復)。
  • Set<Map.Entry<K, V>> entrySet(): 返回此?Map?中所有鍵值對 (Map.Entry?對象) 組成的?Set?集合。這是遍歷?Map?最常用的方式。

其他:

  • int size(): 返回鍵值對的數量。
  • boolean isEmpty(): 判斷?Map?是否為空。
  • default V getOrDefault(Object key, V defaultValue): (JDK8+) 獲取指定鍵的值,如果鍵不存在則返回默認值。
  • default V putIfAbsent(K key, V value): (JDK8+) 如果指定鍵尚未與值關聯(或關聯為?null),則將其與給定值關聯并返回?null,否則返回當前值。
  • default boolean remove(Object key, Object value): (JDK8+) 僅當指定鍵當前映射到指定值時刪除該條目。
  • default V replace(K key, V value): (JDK8+) 僅當指定鍵當前映射到某個值時,才替換該條目的值。
  • default boolean replace(K key, V oldValue, V newValue): (JDK8+) 僅當指定鍵當前映射到指定值時,才替換該條目的值。
Map<String, Integer> phoneBook = new HashMap<>();
phoneBook.put("Alice", 123456);
phoneBook.put("Bob", 654321);
phoneBook.put("Charlie", 789012);// 方式1:使用 Map.Entry 遍歷 (最推薦,效率高,一次獲取key和value)
for (Map.Entry<String, Integer> entry : phoneBook.entrySet()) {String name = entry.getKey();int phoneNumber = entry.getValue();System.out.println(name + ": " + phoneNumber);
}// 方式2:遍歷鍵 (KeySet),然后通過鍵找值 (效率稍低于entrySet,因為多了一次get操作)
for (String name : phoneBook.keySet()) {int phoneNumber = phoneBook.get(name);System.out.println(name + ": " + phoneNumber);
}// 方式3:僅遍歷值 (Values) (如果只需要值)
for (int phoneNumber : phoneBook.values()) {System.out.println("Phone: " + phoneNumber);
}// 方式4:Java 8+ 使用 forEach + Lambda 表達式 (簡潔)
phoneBook.forEach((name, phoneNumber) -> System.out.println(name + ": " + phoneNumber));

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

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

相關文章

【Unity】Unity中的StreamingAssets文件夾

目錄前言核心特性1. 文件保留原始格式2. 只讀訪問3. 平臺兼容性不同平臺下的路徑一、使用1、讀寫2、使用UnityWebRequest讀取二、AB讀取的特例三、注意事項前言 StreamingAssets 文件夾是Unity項目中的一個特殊目錄&#xff0c;用于存放需要在運行時訪問的資源文件。這個文件夾…

[windows]torchsig 1.1.0 gr-spectrumdetect模塊安裝

問題 按照提供的readme git clone https://github.com/TorchDSP/torchsig.git cd torchsig pip install . cd gr-spectrumdetect mkdir build cd build cmake ../ make install cd ../examples/ bash trained_model_download.sh gnuradio-companion example.grc &安裝總是出…

網絡安全要了解的知識

基于2025年網絡安全態勢整理的十大高危漏洞類型&#xff0c;結合攻擊影響范圍、技術嚴重性及實際案例分析綜合排序&#xff1a;---1. 訪問控制失效- 核心問題&#xff1a;權限校驗缺失導致越權操作&#xff08;如修改URL參數獲取他人數據&#xff09;。 - 案例&#xff1a;202…

xml 格式化

運行效果&#xff1a;免費在線XML格式化工具 - XML代碼美化/壓縮/驗證 代碼實現&#xff1a; using Microsoft.AspNetCore.Mvc; using System.Xml; using System.Xml.Linq;namespace SaaS.OfficialWebSite.Web.Controllers {public class XmlController : Controller{public I…

Pygame音頻播放的最簡框架代碼示例

一、示例代碼&#xff1a;import pygame pygame.init() pygame.mixer.init() pygame.mixer.music.load(/home/lijiang/Music/Lynyrd Skynyrd - Sweet Home Alabama.mp3) pygame.mixer.music.play()while pygame.mixer.music.get_busy():pygame.time.Clock().tick(10)二、代碼詳…

在Ubuntu環境中安裝Docker和Minikube的完整指南

目錄 前言 準備工作 第一部分&#xff1a;安裝Docker 步驟1&#xff1a;卸載舊版本&#xff08;如果有&#xff09; 步驟2&#xff1a;安裝依賴包 步驟3&#xff1a;添加Docker官方GPG密鑰 步驟4&#xff1a;設置Docker倉庫 步驟5&#xff1a;安裝Docker引擎 步驟6&am…

幾個概率分布在機器學習應用示例

一、說明 在這份快速指南中&#xff0c;我們將介紹最重要的分布——從始終公平的均勻分布&#xff0c;到鐘形的正態分布&#xff0c;計數點擊的泊松分布&#xff0c;以及二元選擇的二項分布。 沒有復雜的數學&#xff0c;只有清晰的概念、真實的例子&#xff0c;以及為什么它們…

2025年測繪程序設計模擬賽一--地形圖圖幅編號及圖廓點經緯度計算

想要在2026年參加這個比賽的&#xff0c;可以加入小編和其它大佬所建的群242845175一起來備賽&#xff0c;為2026年的比賽打基礎&#xff0c;也可以私信小編&#xff0c;為你答疑解惑一、讀取文件 這里有兩種文件需要讀取&#xff0c;所以要額外處理 internal class Read {publ…

【C++基礎】名字空間與 inline 命名空間:面試高頻考點與真題解析

想象一下,你正在開發一個大型項目,團隊中有10名程序員同時工作。當你們分別定義了calculate()函數時,編譯器會陷入混亂:它不知道應該調用哪個版本的calculate。這就是C++引入名字空間(Namespace)的根本原因! 一、名字空間(Namespace)基礎概念 1.1 為什么需要名字空間…

Pytest項目_day08(setup、teardown前置后置操作)

setup模塊級setup_module&#xff1a;運行于模塊開始之前&#xff0c;生效一次 一個py文件&#xff08;測試文件&#xff09;就是一個模塊函數級setup_function&#xff1a;對于每條&#xff08;不在類中的&#xff09;函數用例生效&#xff0c;如果函數在類中&#xff0c;那么…

trae開發c#

安裝插件C# Dev Kit&#xff0c;使用的版本是1.41.11 .NET Install Tool一般會自動安裝&#xff0c;安裝C# dev kit的時候&#xff0c;版本2.3.7 C# 插件&#xff0c;版本2.87.31 https://marketplace.visualstudio.com/items?itemNamems-dotnettools.vscode-dotnet-runtim…

Modstart 請求出現 Access to XMLHttpRequest at ‘xx‘

在 uniapp 前端頁面請求時出現類似如下錯誤Access to XMLHttpRequest at https://example.com/api/mtiku/config from origin http://localhost:20000 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control…

計算機視覺CS231n學習(5)

循環神經網絡 RNN recurrent neural networksRNN序列處理能力&#xff08;RNN核心作用&#xff09; RNN處理序列數據&#xff0c;相比“Vanilla”神經網絡&#xff08;僅支持一對一映射&#xff09;&#xff0c;RNN支持多種序列映射模式&#xff1a; 一對一&#xff1a;傳統分類…

Spring Boot Redis 緩存完全指南

Spring Boot Redis 緩存完全指南 1. 項目依賴配置 1.1 Maven依賴 <dependencies><!-- Spring Boot Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><…

八股——WebSocket

文章目錄1、 什么是 WebSocket&#xff1f;與 Http 協議的區別是什么&#xff1f;2、 Http 是如何升級為 WebSocket 的&#xff1f;3、 為什么 WebSocket 可以進行全雙工模式的消息傳輸&#xff0c;而 Http 不可以&#xff1f;4、 什么是 TCP 的沾包和拆包&#xff1f;5、 WebS…

Mysql 如何使用 binlog 日志回滾操作失誤的數據

文章目錄一、背景二、準備測試數據1. 創建測試表2. 創建測試數據三、模擬誤操作四、數據回滾&#xff08;一&#xff09;方案一&#xff1a;云數據庫恢復&#xff08;二&#xff09;方案二&#xff1a;手動恢復1. 查詢 binlog 日志2. 找到刪除語句&#xff0c;手動還原為插入語…

wodpress結構化數據對SEO的作用

在 WordPress 網站中&#xff0c;結構化數據對 SEO 的作用主要體現在以下幾個方面&#xff1a; 1. 提升搜索結果的可見性 結構化數據能夠幫助搜索引擎更好地理解網頁內容&#xff0c;從而以更精準的方式展示搜索結果。通過添加結構化數據&#xff0c;網頁可以在搜索結果中顯示…

講一講@ImportResource

題目詳細答案ImportResource是 Spring 框架中的一個注解&#xff0c;用于將傳統的 XML 配置文件導入到基于 Java 配置的 Spring 應用程序中。它允許開發者在使用 Java 配置的同時&#xff0c;繼續利用現有的 XML 配置文件。這樣可以逐步遷移舊的 XML 配置&#xff0c;或者在某些…

解決 Nginx 反代中 proxy_ssl_name 環境變量失效問題:網頁能打開但登錄失敗

前言&#xff1a;在現代企業架構中&#xff0c;多域名反向代理是實現業務隔離、品牌獨立的常見方案。然而&#xff0c;看似簡單的Nginx配置背后&#xff0c;隱藏著與TLS協議、后端認證邏輯深度綁定的細節陷阱。本文將從原理到實踐&#xff0c;詳解為何在多域名場景下&#xff0…

三步完成,A100本地vLLM部署gpt-oss,并啟動遠程可訪問api

A100本地vLLM部署gpt-oss&#xff0c;并啟動遠程可訪問api GPT-oss試用 gpt-oss有兩個原生配置是目前&#xff08;2025-8-8&#xff09;Ampere系列顯卡不支持的&#xff0c;分別是默認的MXFP4量化&#xff0c;以及Flash-attn V3。官方給出的vllm教程也是默認使用的是H系列顯卡…