011_異常、泛型和集合框架

異常、泛型和集合框架

  • 異常
    • Java的異常體系
      • 異常的作用
    • 自定義異常
    • 異常的處理方案
      • 異常的兩種處理方式
  • 泛型
    • 泛型類
    • 泛型接口
    • 泛型方法、通配符和上下限
    • 泛型支持的類型
  • 集合框架
    • 集合體系結構
      • Collection
    • Collection集合
      • Collection的遍歷方式
      • 認識并發修改異常問題
        • 解決并發修改異常問題的方案
    • List集合
      • List集合的特有方法
      • ArrayList底層原理
      • LinkedList的底層原理
      • LinkedList的應用場景

異常

  • 異常代表程序出現的問題。

Java的異常體系

  • Java.lang.Throwable
    • Error
    • Exception
      • RuntimeException
      • 其他異常…
  • Error:代表的系統級別錯誤(屬于嚴重問題),也就是說系統一旦出現問題,sun公司會把這些問題封裝為Error對象給出來。
  • Exception:叫異常:它代表的才是我們程序可能出現的問題,所以通常會用Exception以及它的孩子來封裝程序出現的問題。
  • 運行時異常:RuntimeException及其子類,編譯階段不會出現錯誤提醒,運行時出現的異常
  • 編譯時異常:“其他異常…” 編譯階段就會出現錯誤提醒的。
  • 拋出異常(throws)
    • 在方法上使用throws關鍵字,可以將方法內部出現的異常拋出去給調用者處理。
方法 throws 異常1 ,異常2 ,異常3 ..{}
  • 捕獲異常(try…catch)
    • 直接捕獲程序出現的異常。
try{// 監視可能出現異常的代碼!
}catch(異常類型1 變量){// 處理異常
}catch(異常類型2 變量){// 處理異常
}...

異常的作用

  • 異常使用來定位程序bug的關鍵信息。
  • 可以作為方法內部的一種特殊返回值,以便通知上層調用者,方法的執行問題。

自定義異常

  • Java無法為這個世界上全部的問題都提供異常類來代表, 如果企業自己的某種問題,想通過異常來表示,以便用異常來管理該問題,那就需要自己來定義異常類了。
  • 自定義運行時異常
    • 定義一個異常繼承RuntimeException。
    • 重寫構造器。
    • 通過 throw new 異常類(xxx)來創建異常對象拋出
    • 特點:編譯階段不報錯,運行時才可能出現,提醒不屬于激進型。
  • 自定義編譯時異常
    • 定義一個異常繼承Exception。
    • 重寫構造器。
    • 通過 throw new 異常類(xxx)創建異常對象并拋出。
    • 特點:編譯階段就報錯,提醒比較激進。

異常的處理方案

  1. 方案一:底層異常層層往上拋出,最外層捕獲異常,記錄下異常信息,并響應適合用戶觀看的信息進行提示。
  2. 方案二:最外層捕獲異常后,嘗試重新修復。

異常的兩種處理方式

  • 拋出異常(throws)
方法 throws 異常1 ,異常2 ,異常3 ..{…
}
  • 捕獲異常(try…catch)
try{// 監視可能出現異常的代碼!
}catch(異常類型1 變量){// 處理異常}catch(異常類型2 變量){// 處理異常
}...

泛型

  • 定義類、接口、方法是,同時聲明了一個或多個類型變量(如:)
    • 稱為泛型類、泛型接口、泛型方法,它們統稱為泛型。
public class ArrayList<E>{. . .
}
  • 作用:泛型提供了在編譯階段約束所能操作的數據類型,并自動進行檢查的能力. 這樣可以避免強制類型轉換,及其可能出現的異常。
  • 泛型的本質:把具體的數據類型作為參數給類型變量。

泛型類

修飾符 class 類名<類型變量,類型變量,…> { 
}
  • 類型變量建議用大寫的英文字母,常用的有:E、T、K、V 等

泛型接口

修飾符 interface 接口名<類型變量,類型變量,…> { 
}

泛型方法、通配符和上下限

  • 泛型方法
修飾符 <類型變量,類型變量,…>  返回值類型 方法名(形參列表) { }
  • 通配符
    • 就是 “?”,可以在 “使用泛型” 的時候代表一切類型; E T K V 是在定義泛型的時候使用。
  • 泛型的上下限:
    • 泛型上限:? extends Car: ? 能接收的必須是Car或者其子類 。
    • 泛型下限:? super Car:? 能接收的必須是Car或者其父類。

泛型支持的類型

  • 泛型不支持基本數據類型,只能支持對象類型(引用數據類型)。
    • 可以使用基本數據類型的包裝類。

集合框架

  • 集合是一種容器,用來裝數據的,類似于數組,但集合的大小可變,開發中也非常常用。

集合體系結構

  • Collection 代表單列集合,每個元素(數據)只包括一個值。
  • Map 代表雙列集合,每個元素包含兩個值(鍵值對)。

Collection

  • Collection
    • List
      • ArrayList
      • LinkedList
    • Set
      • HashSet
        • LinkedHashSet
      • TreeSet
  • Collection集合特點
    • List系列集合:添加的元素是有序、可重復、有索引。
      • ArrayList、LinekdList:有序、可重復、無索引。
    • Set系列集合:添加的元素是無序、不重復、無索引。
      • HashSet:無序、不重復、無索引。
      • LinkedHashSet:有序、不重復、無索引。
      • TreeSet:按照大小默認升序排序、不重復、無索引。

Collection集合

  • Collection是單列集合的祖宗,它規定的方法(功能)是全部單列集合都會繼承的。
方法名說明
public boolean add(E e)把給定的對象添加到當前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把給定的對象在當前集合中刪除
public boolean contains(Object obj)判斷當前集合中是否包含給定的對象
public boolean isEmpty()判斷當前集合是否為空
public int size()返回集合中元素的個數。
public Object[] toArray()把集合中的元素,存儲到數組中

Collection的遍歷方式

  1. 迭代器遍歷
    • 迭代器是用來遍歷集合的專用方式(數組沒有迭代器),在Java中迭代器的代表是Iterator。
方法名稱說明
Iterator iterator()返回集合中的迭代器對象,該迭代器對象默認指向當前集合的第一個元素
  • Iterator迭代器中的常用方法
方法名稱說明
boolean hasNext()詢問當前位置是否有元素存在,存在返回true ,不存在返回false
E next()獲取當前位置的元素,并同時將迭代器對象指向下一個元素處。
  1. 增強 for 循環
  • 增強for可以用來遍歷集合或者數組
  • 增強for遍歷集合,本質就是迭代器遍歷集合的簡化寫法。
for (元素的數據類型 變量名 : 數組或者集合) {
}
  1. Lambda表達式
  • JDK 8開始的新技術Lambda表達式,提供了一種更簡單、更直接的方式來遍歷集合。
方法名稱說明
default void forEach(Consumer<? super T> action)結合lambda遍歷集合
Collection<String> lists = new ArrayList<>();
...
lists.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
});
  • 簡化
Collection<String> lists = new ArrayList<>();
...
lists.forEach(s -> {System.out.println(s);
});
//  lists.forEach(s -> System.out.println(s));

認識并發修改異常問題

  • 遍歷集合的同時又存在增刪集合元素的行為時可能出現業務異常,這種現象被稱之為并發修改異常問題。
解決并發修改異常問題的方案
  • 如果集合支持索引,可以使用for循環遍歷,每刪除數據后做 i–;或者可以倒著遍歷。
  • 可以使用迭代器遍歷,并用迭代器提供的刪除方法刪除數據。
  • 增強for循環/Lambda遍歷均不能解決并發修改異常問題,因此增它們只適合做數據的遍歷,不適合同時做增刪操作。

List集合

  • ArrayList和LinkedList,底層實現不同,適應的場景不同。

List集合的特有方法

  • List集合因為支持索引,所以多了很多與索引相關的方法。
方法名稱說明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)刪除指定索引處的元素,返回被刪除的元素
E set(int index,E element)修改指定索引處的元素,返回被修改的元素
E get(int index)返回指定索引處的元素
  • List集合支持的遍歷方式
    • for循環
    • 迭代器
    • 增強for循環
    • Lambda表達式

ArrayList底層原理

  • ArrayList底層是基于數組存儲數據的。
  • 數組的特點
    • 查詢速度快:查詢數據通過地址值和索引定位,查詢任意數據耗時相同。

    • 增刪數據效率低:可能需要把后面很多的數據進行前移。

LinkedList的底層原理

  • LinkedList底層是基于鏈表存儲數據的。
    • 基于雙鏈表實現的。
      • 特點:查詢慢,增刪相對較快,但對首尾元素進行增刪改查的速度是極快的。
  • 鏈表的特點:
    • 鏈表中的數據是一個一個獨立的結點組成的,結點在內存中是不連續的,每個結點包含數據值和下一個結點的地址。
    • 查詢慢,無論查詢哪個數據都要從頭開始找。
    • 鏈表增刪相對快.
  • 雙鏈表:對首尾元素進行增刪改查的速度是極快的。
  • LinkedList新增了很多首尾操作的特有方法。
方法名稱說明
public void addFirst(E e)在該列表開頭插入指定的元素
public void addLast(E e)將指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一個元素
public E getLast()返回此列表中的最后一個元素
public E removeFirst()從此列表中刪除并返回第一個元素
public E removeLast()從此列表中刪除并返回最后一個元素

LinkedList的應用場景

  • 用來設計隊列
    • 隊列的特點:先進先出,后進后出。
  • 用來設計棧
    • 棧的特點:后進先出,先進后出。
    • 數據進入棧模型的過程稱為:壓/進棧(push)
    • 數據離開棧模型的過程稱為:彈/出棧(pop)
  • 使用首尾元素,用Linked來實現很合適。

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

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

相關文章

Kubernetes 集群搭建(三):使用dashboard用戶界面(需要訪問外網獲取yaml)

&#xff08;一&#xff09;簡介 K8s Dashboard是Kubernetes提供的一種基于Web的用戶界面工具&#xff0c;用于可視化地管理和監控Kubernetes集群 主要功能&#xff1a; 資源查看與管理&#xff1a; 查看Kubernetes集群中的各種資源&#xff0c;如節點、Pod、服務、部署等。 對…

【數據挖掘】嶺回歸(Ridge Regression)和線性回歸(Linear Regression)對比實驗

這是一個非常實用的 嶺回歸&#xff08;Ridge Regression&#xff09;和線性回歸&#xff08;Linear Regression&#xff09;對比實驗&#xff0c;使用了 scikit-learn 中的 California Housing 數據集 來預測房價。 &#x1f4e6; 第一步&#xff1a;導入必要的庫 import num…

大疆無人機系列知識

目錄 知識 開發者文檔 &#xff08;上云&#xff09; 無人機的應用 知識 大疆行業無人機接入音視頻平臺協議詳解_大疆無人機 視頻流-CSDN博客 開發者文檔 &#xff08;上云&#xff09; 上云API 無人機的應用 【大疆無人機地圖測繪技術學習&#xff1a;高精度、高效率的…

CNN注意力機制的進化史:深度解析10種注意力模塊如何重塑卷積神經網絡

&#x1f31f; 引言&#xff1a;注意力為何改變CNN的命運&#xff1f; 就像人類視覺會優先聚焦于重要信息&#xff0c;深度學習模型也需要"學會看重點"。從2018年SENet首提通道注意力&#xff0c;到2024年SSCA探索空間-通道協同效應&#xff0c;注意力機制正成為CNN…

Linux/樹莓派網絡配置、遠程登錄與圖形界面訪問實驗

一.準備工作 1.修改網絡適配器&#xff08;選擇本機網卡&#xff09; 2.創建一個新的用戶。 3.使用新用戶登錄&#xff0c;使用ip a指令查看IP&#xff08;現代 Linux 發行版&#xff08;如 Ubuntu、Debian、CentOS、Fedora 等&#xff09;&#xff09;。 通過sudo arp-sca…

Python----TensorFlow(TensorFlow介紹,安裝,主要模塊,高級功能)

一、TensorFlow TensorFlow 是由谷歌大腦團隊于 2015 年推出的開源機器學習框架。作為深度學習的第二代系統&#xff0c;TensorFlow 支持多種編程語言&#xff0c;包括 Python、C、Java 和 Go&#xff0c;廣泛應用于 CNN、RNN 和 GAN 等深度學習算法。 TensorFlow 可以…

【動態規劃】 深入動態規劃 回文子串問題

文章目錄 前言例題一、回文子串二、 最長回文子串三、回文串分割IV四、分割回文串II五、最長回文子序列六、讓字符串成為回文串的最小插入次數 結語 前言 那么&#xff0c;什么是動態規劃中的回文子串問題呢&#xff1f; 動態規劃中的回文子串問題是一個經典的字符串處理問題。…

lodash庫介紹(一個現代JavaScript實用工具庫,提供模塊化、性能優化和額外功能)JavaScript庫(防抖、節流、函數柯里化)JS庫

https://www.lodashjs.com/ 文章目錄 Lodash庫全解析簡介核心優勢一致性API模塊化設計性能優化 常用功能分類數組操作對象操作函數增強 高級應用場景數據轉換鏈函數組合 性能考量大數據集處理 最佳實踐按需引入利用FP模塊 結語 Lodash庫全解析 簡介 Lodash是一個現代JavaScri…

Spring MVC 國際化機制詳解(MessageSource 接口體系)

Spring MVC 國際化機制詳解&#xff08;MessageSource 接口體系&#xff09; 1. 核心接口與實現類詳解 接口/類名描述功能特性適用場景MessageSource核心接口&#xff0c;定義消息解析能力支持參數化消息&#xff08;如{0}占位符&#xff09;所有國際化場景的基礎接口Resource…

PyTorch張量范數計算終極指南:從基礎到高階實戰

在深度學習領域&#xff0c;張量范數計算是模型正則化、梯度裁剪、特征歸一化的核心技術。本文將以20代碼實例&#xff0c;深度剖析torch.norm的9大核心用法&#xff0c;并揭示其在Transformer模型中的關鍵應用場景。 &#x1f680; 快速入門&#xff08;5分鐘掌握核心操作&…

榮耀90 GT信息

外觀設計 屏幕&#xff1a;采用 6.7 英寸 AMOLED 榮耀綠洲護眼屏&#xff0c;超窄邊框設計&#xff0c;其上邊框 1.6mm&#xff0c;左右黑邊 1.25mm&#xff0c;屏占較高&#xff0c;帶來更廣闊的視覺體驗。屏幕還支持 120Hz 自由刷新率&#xff0c;可根據使用場景自動切換刷新…

【Java中級】11章、枚舉 - java引用數據類型,枚舉介紹、快速入門,了解枚舉類的基本使用方式【1】

文章內容&#xff1a; 自定義實現枚舉enum關鍵字實現枚舉 ??內容涉及枚舉的定義&#xff0c;快速入門&#xff0c;注意事項和小題鞏固知識點 &#x1f308; 跟著B站一位老師學習的內部類內容&#xff0c;現寫這篇文章為學習內部類的小伙伴提供思路支持&#xff0c;希望可以一…

局域網訪問 Redis 方法

局域網訪問 Redis 方法 默認情況下&#xff0c;Redis 只允許本機 (127.0.0.1) 訪問。如果你想讓局域網中的其他設備訪問 Redis&#xff0c;需要 修改 Redis 配置&#xff0c;并確保 防火墻放行端口。 方法 1&#xff1a;修改 Redis 配置 1. 修改 redis.conf&#xff08;或 me…

如何應對客戶頻繁變更需求

如何應對客戶頻繁變更需求&#xff1f;要點包括&#xff1a; 快速響應、深入溝通、靈活規劃、過程記錄、風險管控。這些策略既能降低項目失控風險&#xff0c;也能幫助團隊在變動環境中保持高效率。其中深入溝通尤為關鍵&#xff0c;它不僅能夠讓團隊第一時間了解客戶意圖&…

Set 集合

默認情況下&#xff0c; Scala 使用的是不可變集合&#xff0c; 如果你想使用可變集合&#xff0c; 需要引用 scala.collection.mutable.Set Set 默認是不可變集合&#xff0c;數據無序 數據不可重復 遍歷集合 創建可變集合 mutable.Set 打印集合 集合添加元素 向集合中…

最新 OpenHarmony 系統一二級目錄整理

我們在學習 OpenHarmony 的時候&#xff0c;如果對系統的目錄結構了解&#xff0c;那么無疑會提升自己對 OpenHarmony 更深層次的認識。 于是就有了今天的整理。 首先在此之前&#xff0c;我們要獲取源碼 獲取源碼的方式 OpenHarmony 主干代碼獲取 方式一&#xff08;推薦&am…

STL常用容器整理

STL常用容器操作整理 STL常用容器操作整理&#xff08;string/vector/set/map&#xff09;一、string&#xff08;字符串&#xff09;構造函數元素訪問修改操作容量操作子串與查找 二、vector&#xff08;動態數組&#xff09;構造函數元素訪問修改操作容量操作 三、set&#x…

Unity 實現傷害跳字

核心組件&#xff1a; Dotween TextMeshPro 過程軌跡如下圖&#xff1a; 代碼如下&#xff1a; using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …

Ubuntu 22.04 AI大模型環境配置及常用工具安裝

一、基礎環境準備 1.1 系統準備 建議使用 Ubuntu22.04 以下配置皆以 Ubuntu22.04 系統版本為例 1.2 安裝git apt-get update && apt-get install git -y1.3 安裝 Python 3.9 【建議安裝 3.10】&#xff08;安裝miniconda或者conda來管理虛擬環境&#xff09; wget …

STM32單片機入門學習——第27節: [9-3] USART串口發送串口發送+接收

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.04.08 STM32開發板學習——第27節: [9-3] USART串口發送&串口發送接收 前言開發板說…