【Java】泛型與集合篇(一)

泛型與集合(一)

  • 泛型
    • 泛型的核心作用
    • 泛型類型(類)
      • 定義與使用
      • 類型參數命名約定
    • 泛型方法
      • 定義與調用
      • 與泛型類的區別
    • 通配符
      • 上界通配符
      • 下界通配符
    • 有界類型參數
    • 類型擦除
  • 集合框架
    • 核心接口
      • Collection 接口
      • Map 接口
    • Collection 接口操作的常用方法
      • 基本操作
      • 批量操作
      • 數組操作
      • 流操作方法
  • List 接口及實現類
    • List 接口
      • List 接口概述
      • List 接口常用方法
      • List 接口與 Collections 接口
    • ArrayList 類
      • 特點與實現原理
      • 構造方法
    • 遍歷集合元素
      • 使用簡單的 for 循環
      • 使用增強的 for 循環
      • 使用迭代器
      • 雙向迭代器
    • 數組轉換為 List 對象
      • 使用 Arrays.asList() 方法
      • 手動遍歷數組添加到 ArrayList
      • 使用 Java 8 Stream API
      • 基本類型數組轉換為 List
    • Vector 類和 Stack 類
      • Vector 類
        • 概述
        • 常用方法
      • Stack 類
        • 概述
        • 常用方法

泛型

泛型的核心作用

泛型是 Java 實現代碼復用和類型安全的重要機制。它允許在類、接口和方法中定義類型參數,使代碼能處理多種數據類型,同時避免強制類型轉換和運行時類型錯誤。例如,在集合中使用泛型,可確保集合中元素類型的一致性,在編譯階段就能檢測出類型錯誤,增強代碼的健壯性和可讀性。

泛型類型(類)

定義與使用

定義泛型類時,通過尖括號 聲明類型參數,T 可以是類、接口、數組類型(基本數據類型需使用包裝類型)。以 Box 類為例:

public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

使用時,需指定具體的類型參數。從 Java 7 開始,可使用菱形語法簡化創建對象的過程:

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
System.out.println(stringBox.getContent()); 

類型參數命名約定

類型參數命名通常使用單個大寫字母作為類型參數名,常見的有 E(表示元素)、K(表示鍵)、V(表示值)、T(表示類型)、N(表示數字)等。遵循這些約定,能使代碼更易理解。

泛型方法

定義與調用

泛型方法在方法返回值前聲明類型參數 ,其作用域僅限于該方法。例如,定義一個打印數組元素的泛型方法:

public static <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}System.out.println();
}

調用時,編譯器會自動推斷類型:

Integer[] intArr = {1, 2, 3};
printArray(intArr); 

與泛型類的區別

泛型類的類型參數作用于整個類,而泛型方法的類型參數僅在聲明的方法內有效。泛型方法還可以在非泛型類中定義,增加了代碼的靈活性。

通配符

上界通配符

上界通配符(<?extends T>)用于限制類型為T或其子類,增強泛型的靈活性。例如,計算列表中數字元素總和的方法:

public static double sum(List<? extends Number> list) {double sum = 0;for (Number num : list) {sum += num.doubleValue();}return sum;
}

該方法可接受 List<Integer>、List<Double> 等類型的參數。

下界通配符

下界通配符(<?super T>)限制類型為 T 或其父類。比如,向列表中添加 Integer 類型元素的方法:

public static void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);
}

此方法可接受 List<Number>、List<Object> 等類型的參數。

有界類型參數

使用 extends 或 super 限制類型參數的范圍。例如,定義一個計算數字平方的 Calculator 類:

public class Calculator<T extends Number> {public double square(T num) {return num.doubleValue() * num.doubleValue();}
}

類型擦除

泛型在編譯后會被替換為 Object 或邊界類型,運行時無法獲取泛型信息。例如, List 和 List 在運行時都變為 List。這是為了保持 Java 的向后兼容性,但也帶來了一些局限性,如無法在運行時根據泛型類型進行不同的處理。

集合框架

核心接口

Collection 接口

是所有集合的根接口,繼承了 Iterable 接口,定義了集合的基本操作方法。它的主要子接口有 List、Set、Queue,每個子接口都有不同的特性和用途。List 是有序且可重復的集合,Set 是無序且不可重復的集合,Queue 是按特定順序處理元素的集合。

Map 接口

用于存儲鍵值對,與 Collection 接口并列。在 Map 中,鍵是唯一的,值可以重復,常用于根據鍵快速查找值的場景。

Collection 接口操作的常用方法

基本操作

  • 向集合中添加元素 e:boolean add(E e)
  • 從集合中刪除指定的元素 o:boolean remove(Object o)
  • 返回集合中是否包含指定的元素 o:boolean contains(Object o)
  • 返回集合是否為空,即不包含元素:boolean isEmpty()
  • 返回集合中包含的元素個數:int size()
  • 返回包含所有元素的迭代器對象:Iterator iterator()
  • 從父接口繼承的方法,在集合的每個元素上執行指定的操作:default void forEach(Consumer<? super T>action)

以下是這些方法的代碼示例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;public class CollectionExample {public static void main(String[] args) {// 創建一個集合對象,這里以ArrayList為例,它實現了Collection接口Collection<Integer> collection = new ArrayList<>();// 測試add方法boolean addResult = collection.add(5);System.out.println("添加元素結果: " + addResult);// 測試remove方法boolean removeResult = collection.remove(5);System.out.println("刪除元素結果: " + removeResult);// 測試contains方法collection.add(10);boolean containsResult = collection.contains(10);System.out.println("集合是否包含元素: " + containsResult);// 測試isEmpty方法boolean isEmptyResult = collection.isEmpty();System.out.println("集合是否為空: " + isEmptyResult);// 測試size方法int size = collection.size();System.out.println("集合元素個數: " + size);// 測試iterator方法Iterator<Integer> iterator = collection.iterator();while (iterator.hasNext()) {Integer element = iterator.next();System.out.println("迭代器遍歷元素: " + element);}// 測試forEach方法collection.add(20);collection.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.println("forEach方法操作元素: " + integer);}});}
}

批量操作

  • 將集合c中的所有元素添加到當前集合中:boolean addAll(Collection<? extends E> c)
  • 從當前集合中刪除 c 中的所有元素:boolean removeAll(Collection<?> c)
  • 從當前集合中刪除滿足謂詞的所有元素:default boolean removeIf(Predicate<? super E> filter)
  • 返回當前集合是否包含 c 中的所有元素:boolean containsAll(Collection<?> c)
  • 在當前集合中只保留指定集合 c 中的元素,其他元素刪除:boolean retainAll(Collection<?> c)
  • 將集合清空:void clear()

以下是這些方法的代碼示例:

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Predicate;public class CollectionBatchOperationsExample {public static void main(String[] args) {

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

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

相關文章

HarmonyOS組件之Tabs

Tabs 1.1概念 Tabs 視圖切換容器&#xff0c;通過相適應的頁簽進行視圖頁面的切換的容器組件每一個頁簽對應一個內容視圖Tabs擁有一種唯一的子集元素TabContent 1.2子組件 不支持自定義組件為子組件&#xff0c;僅可包含子組件TabContent&#xff0c;以及渲染控制類型 if/e…

華為FusionCompute虛擬化平臺

一、華為FusionCompute虛擬化套件介紹 華為FusionCompute虛擬化套件是業界領先的虛擬化解決方案&#xff0c;能夠幫助客戶帶來如下的價值&#xff0c;從而大幅提升數據中心基礎設施的效率。 幫助客戶提升數據中心基礎設施的資源利用率&#xff1b;幫助客戶成倍縮短業務上線周期…

使用apt-rdepends制作軟件離線deb安裝包

使用apt-rdepends制作軟件離線deb安裝包 除基礎軟件外&#xff0c;還要獲取軟件依賴包。 依賴包工具安裝 apt-get install apt-rdependsapt-rdepends工具使用 使用apt-rdepends工具&#xff0c;遞歸方式分析軟件依賴&#xff0c;下載軟件包本體&#xff0c;和依賴包。制作時…

【ISO 14229-1:2023 UDS診斷(ECU復位0x11服務)測試用例CAPL代碼全解析⑩】

ISO 14229-1:2023 UDS診斷【ECU復位0x11服務】_TestCase10 作者&#xff1a;車端域控測試工程師 更新日期&#xff1a;2025年02月18日 關鍵詞&#xff1a;UDS診斷協議、ECU復位服務、0x11服務、ISO 14229-1:2023 TC11-010測試用例 用例ID測試場景驗證要點參考條款預期結果TC…

什么是Scaling Laws(縮放定律);DeepSeek的Scaling Laws

什么是Scaling Laws(縮放定律) Scaling Laws(縮放定律)在人工智能尤其是深度學習領域具有重要意義,以下是相關介紹及示例: 定義與內涵 Scaling Laws主要描述了深度學習模型在規模(如模型參數數量、訓練數據量、計算資源等)不斷擴大時,模型性能與這些規模因素之間的…

大一計算機的自學總結:前綴樹(字典樹、Trie樹)

前言 前綴樹&#xff0c;又稱字典樹&#xff0c;Trie樹&#xff0c;是一種方便查找前綴信息的數據結構。 一、字典樹的實現 1.類描述實現 #include <bits/stdc.h> using namespace std;class TrieNode { public:int pass0;int end0;TrieNode* nexts[26]{NULL}; };Tri…

【存儲中間件API】MySQL、Redis、MongoDB、ES常見api操作及性能比較

常見中間件api操作及性能比較 ?? MySQL crud操作?? maven依賴?? 配置?? 定義實體類?? 常用api ?? Redis crud操作?? maven依賴?? 配置?? 常用api ?? MongoDB crud操作?? maven依賴?? 配置文件?? 定義實體類?? MongoDB常用api ?? ES crud操作 ??…

51單片機入門_10_數碼管動態顯示(數字的使用;簡單動態顯示;指定值的數碼管動態顯示)

接上篇的數碼管靜態顯示&#xff0c;以下是接上篇介紹到的動態顯示的原理。 動態顯示的特點是將所有位數碼管的段選線并聯在一起&#xff0c;由位選線控制是哪一位數碼管有效。選亮數碼管采用動態掃描顯示。所謂動態掃描顯示即輪流向各位數碼管送出字形碼和相應的位選&#xff…

C++入門《類和對象》之《運算符重載》詳解|成員函數重載/非成員函數重載

C 中&#xff0c;運算符重載是一種特殊的函數&#xff0c;它允許程序員為自定義的數據類型&#xff08;如類和結構體&#xff09;重新定義運算符的行為&#xff0c;使得這些運算符能夠像處理內置數據類型一樣處理自定義類型的數據。下面將從多個方面詳細講解 C 里的運算符重載。…

Salesforce 檢索Layout的設定

做了許多Object&#xff0c;卻想不起來怎么設置我的Listview的項目了。 問題&#xff1a; salesforce 最近參照したオブジェクト 表示項目を変更したいですが、「検索レイアウト」の選択メニューが該當オブジェクトのオブジェクトマネージャーから出てないです。 解決方法&am…

SECS/GEM300應用案例參考

GEM300 是一種用于半導體制造領域的通信協議標準&#xff0c;主要用于支持 300mm 晶圓制造的自動化生產。以下是 GEM300 的一些具體應用案例&#xff1a; 1. 半導體設備集成 設備制造商的應用&#xff1a;廣州金南瓜科技有限公司通過 GEM300 SDK&#xff0c;幫助國內多個半導體…

win10系統上的虛擬機安裝麒麟V10系統提示找不到操作系統

目錄預覽 一、問題描述二、原因分析三、解決方案四、參考鏈接 一、問題描述 win10系統上的虛擬機安裝麒麟V10系統提示找不到操作系統&#xff0c;報錯&#xff1a;Operating System not found 二、原因分析 國產系統&#xff0c;需要注意的點&#xff1a; 需要看你的系統類…

情書網源碼 情書大全帝國cms7.5模板

源碼介紹 帝國cms7.5仿《情書網》模板源碼&#xff0c;同步生成帶手機站帶采集。適合改改做文學類的網站。 效果預覽 源碼獲取 情書網源碼 情書大全帝國cms7.5模板

C語言題目:鏈表數據求和操作

題目描述 讀入10個復數&#xff0c;建立對應鏈表&#xff0c;然后求所有復數的和。 輸入格式 無 輸出格式 無 樣例輸入 1 2 1 3 4 5 2 3 3 1 2 1 4 2 2 2 3 3 1 1 樣例輸出 2323i 代碼功能概述 createNode 函數&#xff1a; 創建一個包含 10 個復數節點的鏈表。 每個…

STM32 ADC介紹(硬件原理篇)

目錄 背景 AD轉換器 采樣與保持 量化 編碼 AD轉換器轉換原理 DA轉換原理 AD轉換原理 1.逐次逼近型AD轉換器 2.并聯比較型AD轉換器 編碼器 同步D觸發器和邊沿D觸發器 基本RS觸發器 同步RS觸發器 同步D觸發器 邊沿型D觸發器&#xff08;維持-阻塞D觸發器&#xff…

公網遠程家里局域網電腦過程詳細記錄,包含設置路由器。

由于從校內遷居小區,校內需要遠程控制訪問小區內個人電腦,于是早些時間剛好自己是電信寬帶,可以申請公網ipv4不需要花錢,所以就打電話直接申請即可,申請成功后訪問光貓設備管理界面192.168.1.1,輸入用戶名密碼登錄超管(密碼是網上查下就有了)設置了光貓為橋接模式,然后…

流行編程語言全解析:優勢、應用與短板

Python&#xff1a; 優勢 Python 以其簡潔、易讀的語法聞名&#xff0c;新手能快速上手。豐富的庫和框架&#xff0c;能極大地提高開發效率。 適用領域 數據科學與分析&#xff1a;處理和分析大規模數據集&#xff0c;進行數據可視化。典型示例&#xff1a;Google 用 Pytho…

統信服務器操作系統V20 1070A 安裝docker新版本26.1.4

應用場景&#xff1a; 硬件/整機信息&#xff1a;x86平臺、深信服超融合平臺 OS版本信息&#xff1a;統信V20 1070a 1.獲取docker二進制包 鏈接: https://pan.baidu.com/s/1SukBlra0mQxvslTfFakzGw?pwd5s5y 提取碼: 5s5y tar xvf docker-26.1.4.tgz groupadd docker ch…

在 Vue 3 中使用 Lottie 動畫:實現一個加載動畫

在現代前端開發中&#xff0c;動畫是提升用戶體驗的重要元素之一。Lottie 是一個流行的動畫庫&#xff0c;它允許我們使用 JSON 文件來渲染高質量的動畫。本文將介紹如何在 Vue 3 項目中集成 Lottie 動畫&#xff0c;并實現一個加載動畫效果。 如果對你有幫助請幫忙點個&#x…

【Spring】Spring配置文件

目錄 ?什么是配置文件&#xff1f; 配置文件的作用 SpringBoot配置文件 配置文件格式 配置文件的優先級 properties配置文件說明 properties基本語法 讀取配置文件 properties缺點 yml配置文件說明 yml基本語法 使用yml連接數據庫 yml配置不同數據類型及null 注意…