Java 核心--泛型枚舉

作者:IvanCodes

發布時間:2025年4月30日🤓

專欄:Java教程


各位 CSDN伙伴們,大家好!👋 寫了那么多代碼,有沒有遇到過這樣的“驚喜”:滿心歡喜地從 ArrayList 里取出數據,想當然地以為它是個 String,結果一運行,“啪”!一個 ClassCastException 甩在臉上?😵?💫 或者,為了表示幾個固定的狀態(比如訂單處理中、已發貨),用了 1, 2, 3 這樣的“魔法數字”🧙?♂?,過段時間自己都忘了哪個數字對應哪個狀態?🤦?♀?

別擔心,這些都是新手(甚至老手!)路上常見的“坑”。好在 Java 提供了兩大利器來幫我們填坑:泛型 (Generics) 和 枚舉 (Enums)!它們就像給我們的代碼上了雙重保險,讓代碼更安全、更易懂。今天,我們就來把這兩個“保險”搞明白!🛠??

一、 泛型 (<T>):類型的“占位符”,安全的“萬能容器

還記得那個什么都能裝Object 類型的 ArrayList 嗎?它就像一個不透明大麻袋 🛍?,蘋果 🍎、書 📚、玩具 🧸 都能往里扔。方便是方便,可往外取的時候就麻煩了——你得里面是啥,然后強制轉換類型。萬一猜錯了… 運行時就了!💥

泛型 就是來解決這個問題的救星!它的核心思想,說白了就是:把類型檢查這活兒,從不靠譜的運行時,提前到靠譜的編譯時搞定! 并且順便讓代碼更好看、更好用。

它是怎么做到的呢?通過引入 類型參數 (Type Parameters)——你可以把它想象成一個類型的“占位符” (常寫成 <T>, <E> 這類大寫字母)。在定義類、接口或方法的時候,先用這個占位符代表“未來的某種類型”。等到實際使用的時候,再明確告訴編譯器:“嘿,這次這個 <T> 代表的是 String!”或者“這次 <E> 代表 Integer!”

1.1 泛型帶來的實實在在的好處 ?

  • 類型安全 <?>:編譯器成了你的“類型警察”👮?♀?。你往 ArrayList<String> 里塞個 Integer編譯時就給你攔下來!再也不會有運行時的 ClassCastException 意外了。
  • 告別強制類型轉換 <?>:既然編譯器已經幫你把好關了,從 ArrayList<String> 里取出來的元素,它百分百就是 String!再也不用寫 (String) 這種難看又可能出錯的代碼了。代碼瞬間清爽不少!
  • 代碼更通用、復用性更高 <🔄>:想想 ArrayList<T>,一份代碼就能搞定 ArrayList<String>, ArrayList<Integer>, ArrayList<YourCustomClass>… 這就是泛型帶來的代碼復用魔力。

1.2 怎么玩轉泛型

1.2.1 泛型類 <📦>

最常見的用法,定義一個可以持有特定類型對象的類。

// 一個“類型安全”的盒子
public class Box<T> { // <T> 是類型占位符private T item; // 里面的東西是 T 類型public void setItem(T item) {this.item = item;}public T getItem() {return item;}public static void main(String[] args) {// 創建一個只能裝 String 的盒子Box<String> stringBox = new Box<>(); // 明確指定 T 為 StringstringBox.setItem("Hello Generics! <?>");String message = stringBox.getItem(); // 直接就是 String,無需強轉System.out.println(message);// stringBox.setItem(123); // 編譯器報錯?!類型警察出動!// 創建一個只能裝 Integer 的盒子Box<Integer> integerBox = new Box<>();integerBox.setItem(123);int number = integerBox.getItem(); // 直接就是 int (自動拆箱)System.out.println("Number in box: " + number);}
}
1.2.2 泛型方法 <🔧>

有時候,只是某個方法需要處理泛型,而不是整個類。

public class GenericMethodDemo {// 一個可以打印任何類型數組的泛型方法// 類型參數 <E> 聲明在 static 和 返回值 void 之間public static <E> void printArray(E[] inputArray) {System.out.print("Array elements: [ ");for (E element : inputArray) { // element 的類型就是 ESystem.out.print(element + " ");}System.out.println("]");}public static void main(String[] args) {Integer[] intArray = { 1, 2, 3 };String[] stringArray = { "A", "B", "C" };// 調用時通常無需顯式指定,編譯器會自動推斷System.out.println("Integer Array:");printArray(intArray); // 編譯器推斷 E 是 IntegerSystem.out.println("\nString Array:");printArray(stringArray); // 編譯器推斷 E 是 String}
}
1.2.3 有界類型參數 <T extends Number>

想讓你的泛型更“挑剔”一點?比如,我的盒子只裝數字相關的類型!

  • <T extends UpperBound>:告訴編譯器,這里的 T 必須是 UpperBound 這個類,或者是它的子類。就像給盒子貼了個標簽:“僅限數字!”🔢
  • 這讓你可以在泛型代碼內部安全地調用 UpperBound 類定義的方法。
// 一個只能裝 Number 及其子類的盒子
class NumericBox<T extends Number> { // 關鍵字限定上界private T number;// ... setter/getter ...public double getDoubleValue() {// 因為 T 保證是 Number 或其子類,所以可以安全調用 Number 的方法return number.doubleValue();}
}public class BoundedTypeDemo {public static void main(String[] args) {NumericBox<Integer> intBox = new NumericBox<>();   // OK <?>NumericBox<Float> floatBox = new NumericBox<>(); // OK <?>// NumericBox<String> strBox = new NumericBox<>(); // 編譯錯誤?!String 不是 Number}
}
1.2.4 通配符 (Wildcards) <?> <?>

通配符這東西,初看可能有點繞 <😵?💫>,但它主要用在方法參數變量聲明時,讓你寫出更靈活的代碼,可以接收或引用“某種未知類型”的泛型

  • ? (無界通配符): “我啥都能接,但我不知道具體是啥”。List<?> list 可以指向 List<String>, List<Integer> 等等。但為了類型安全,你不能list添加任何元素(除了 null),通常只用于讀取或調用Object的方法。
  • ? extends UpperBound (上界通配符): “我能接 UpperBound 及其所有子類型”。List<? extends Number> list 可以指向 List<Integer>, List<Double> 等。同樣,不能往里添加元素(除了 null),主要用于安全地讀取元素作為 UpperBound 類型(生產者場景)。
  • ? super LowerBound (下界通配符): “我能接 LowerBound 及其所有父類型”。List<? super Integer> list 可以指向 List<Integer>, List<Number>, List<Object>。你可以安全地list添加 Integer 或其子類的對象(消費者場景)。

何時深入? 當你開始大量使用泛型集合作為方法參數,并且希望方法能更通用地處理不同類型的集合時,就是研究通配符的好時機。

二、 枚舉 (enum):定義常量集合的“專屬俱樂部” 👑🚦

現在換個場景。如果你的程序需要表示一組固定的、有限的值,比如一周七天 📅、紅綠燈狀態 🚦、訂單狀態 (待付款、已付款、已發貨…) 等等。

老辦法可能是用 int 常量 (public static final int MONDAY = 1;) 或者 String 常量 (public static final String PENDING = "PENDING";)。但這種方式問題多多

  • 類型不安全🚫:一個期望星期幾 int 的方法,你傳個 100 進去,編譯器根本不管
  • 可讀性差 <😵?💫>:代碼里看到個數字 3,誰知道它代表星期三還是訂單已發貨?得翻文檔去…
  • 沒有命名空間 <🏷?>:常量名容易沖突。
  • 難以管理 <🛠?>:增加或修改常量可能涉及多處代碼。

枚舉 (enum) 就是來終結這種混亂的!它讓你創建一個類型安全、含義清晰、管理方便常量集合

枚舉的核心思想用一個專屬的類型來代表一組有限的、命名的常量,并提供編譯時安全檢查

2.1 枚舉閃光點 ?

  1. 類型安全 <?>:編譯器強制你只能使用枚舉中定義的常量。想給 DayOfWeek 類型的變量賦個 TrafficLight.RED?沒門!編譯錯誤
  2. 代碼清晰、可讀性爆表 <📖>if (order.getStatus() == OrderStatus.SHIPPED)if (order.getStatus() == 3) 不知道清晰多少倍!
  3. 代碼更健壯、易維護 <🛠?>:常量集中管理。想加個“退款中”的狀態?改 enum 就行。
  4. 不僅僅是常量 <💪>枚舉本質上是特殊的class!它可以有構造方法、成員變量、普通方法,甚至可以實現接口!功能遠超你的想象!

2.2 玩轉枚舉

2.2.1 基礎款枚舉 <🚦>

最簡單的用法,就是定義一組常量。

// 定義交通信號燈枚舉
public enum TrafficLight { // 使用 enum 關鍵字RED, YELLOW, GREEN // 常量列表,規范用大寫
}public class BasicEnumSwitchDemo {public static void main(String[] args) {TrafficLight currentLight = TrafficLight.GREEN;// 在 switch 中使用枚舉是絕配!<🎯>switch (currentLight) {case RED: // case 后面直接用常量名,不用寫 TrafficLight.REDSystem.out.println("Stop! <?>");break;case YELLOW:System.out.println("Caution! <??>");break;case GREEN:System.out.println("Go! <?>");break;// default 通常可以省略,因為枚舉類型是有限的}// 遍歷枚舉所有常量System.out.println("\nAll light states:");for (TrafficLight light : TrafficLight.values()) { // values() 獲取所有常量數組System.out.println("- " + light + " (ordinal: " + light.ordinal() + ")"); // ordinal() 是常量順序}// 從字符串獲取枚舉常量TrafficLight lightFromString = TrafficLight.valueOf("RED"); // valueOf(),字符串必須精確匹配System.out.println("\nLight from string 'RED': " + lightFromString);}
}
2.2.2 進階版枚舉:帶屬性和方法 <👑><??>

讓你的常量“活”起來,擁有自己的數據和行為!

// 星期枚舉,包含是否是工作日的屬性和方法
public enum DayOfWeek {MONDAY(true),   // 調用構造方法傳入 trueTUESDAY(true),WEDNESDAY(true),THURSDAY(true),FRIDAY(true),SATURDAY(false),  // 調用構造方法傳入 falseSUNDAY(false);private final boolean isWeekday; // final 實例變量// 構造方法必須是 private (或包級私有)private DayOfWeek(boolean isWeekday) {this.isWeekday = isWeekday;}// 公共方法來獲取屬性public boolean isWeekday() {return isWeekday;}// 還可以定義其他方法public void printTypeOfDay() {if (isWeekday) {System.out.println(this.name() + " is a weekday. <💼>");} else {System.out.println(this.name() + " is part of the weekend! <🎉>");}}
}public class EnumWithMethodDemo {public static void main(String[] args) {DayOfWeek today = DayOfWeek.SATURDAY;System.out.println("Is today a weekday? " + today.isWeekday()); // falsetoday.printTypeOfDay(); // SATURDAY is part of the weekend! <🎉>System.out.println("\nChecking all days:");for (DayOfWeek day : DayOfWeek.values()) {day.printTypeOfDay();}}
}

三、 泛型 vs. 枚舉 & 何時請哪位“大神”? 🤔??

雖然都是好東西,但它們解決的問題完全不同:

  • 泛型出馬:當你需要編寫能處理各種不同(但類型未知)數據的通用代碼時,比如 List<T>, Map<K,V>,或者一個通用的排序方法。目標是類型參數化編譯時安全
  • 枚舉出馬:當你需要表示一個固定的、有限的、已知的常量集合時,比如星期、方向、狀態、顏色等。目標是類型安全可讀性清晰地表達意圖

簡單概括泛型處理不確定性 (類型);枚舉處理確定性 (常量集合)。

四、總結 🏁?

泛型枚舉,就像給你的 Java 代碼裝上了安全帶清晰的路標

  • 泛型 (<T>): 編譯時就幫你擋住類型錯誤 <🛡?>,省去強制轉換的麻煩 <?>,讓代碼復用更容易 <🔄>。
  • 枚舉 (enum): 把混亂的常量變成類型安全易讀易維護的“專屬俱樂部” <👑>,還能自帶屬性和方法 <💪>。

我的經驗是:一旦你習慣了使用它們,就再也回不去那個充滿ClassCastException魔法數字的“蠻荒時代”了!😄 它們是寫出高質量現代 Java 代碼的必備技能


五、練練手,檢驗成果!??🧠

光聽不練等于零,動手試試吧!

? 泛型應用 ?

  1. 創建一個泛型接口 Comparator<T>,包含一個方法 int compare(T o1, T o2),用于比較兩個 T 類型的對象。然后創建一個實現類 StringLengthComparator 實現 Comparator<String>,用于比較字符串的長度。
  2. 編寫一個泛型方法 <T> T findFirstMatch(List<T> list, Predicate<T> condition),該方法接收一個列表和一個條件(Predicate 是一個函數式接口,可以用 lambda 表達式 t -> boolean),返回列表中第一個滿足條件的元素,如果找不到則返回 null。(提示:Predicate<T> 接口有一個 test(T t) 方法)

? 枚舉應用 ?

  1. 定義一個枚舉 Size,包含常量 SMALL, MEDIUM, LARGE
  2. 為第 3 題的 Size 枚舉添加一個int類型的 minWidth 字段和一個int類型的 maxWidth 字段,并提供構造方法和 getter。例如 SMALL(0, 50), MEDIUM(51, 100), LARGE(101, Integer.MAX_VALUE)

? 概念理解 ?

  1. 什么是類型擦除?它是泛型實現的一部分嗎?它對我們編寫泛型代碼有什么影響?(簡單說明即可)
  2. 枚舉類型可以extends(繼承)另一個類嗎?可以implements(實現)接口嗎?

六、參考答案 ?💡

? 泛型應用答案 ?

1.Comparator<T> 接口與實現:

import java.util.Comparator; // Java 標準庫已有 Comparator 接口,這里是模擬// 泛型接口定義
interface MyComparator<T> {int compare(T o1, T o2);
}// 實現類,比較字符串長度
class StringLengthComparator implements MyComparator<String> {@Overridepublic int compare(String s1, String s2) {// 返回負數表示 s1 < s2, 0 表示相等, 正數表示 s1 > s2return Integer.compare(s1.length(), s2.length());// 或者直接: return s1.length() - s2.length();}
}// 測試
public class ComparatorTest {public static void main(String[] args) {MyComparator<String> comparator = new StringLengthComparator();String str1 = "Java";String str2 = "Generics";int result = comparator.compare(str1, str2); // 比較 "Java" 和 "Generics" 的長度if (result < 0) {System.out.println("'" + str1 + "' is shorter than '" + str2 + "'");} else if (result > 0) {System.out.println("'" + str1 + "' is longer than '" + str2 + "'");} else {System.out.println("'" + str1 + "' and '" + str2 + "' have the same length.");}}
}

2.查找第一個匹配元素的泛型方法:

import java.util.List;
import java.util.Arrays;
import java.util.function.Predicate; // Java 8 的函數式接口public class FindFirstMatchDemo {public static <T> T findFirstMatch(List<T> list, Predicate<T> condition) {if (list == null || list.isEmpty() || condition == null) {return null;}for (T item : list) {if (condition.test(item)) { // 使用 Predicate 的 test 方法判斷條件return item; // 找到第一個滿足條件的,立即返回}}return null; // 遍歷完都沒找到}public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 查找第一個長度大于 4 的名字String longName = findFirstMatch(names, name -> name.length() > 4);System.out.println("First name longer than 4 chars: " + longName); // CharlieList<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 查找第一個偶數Integer firstEven = findFirstMatch(numbers, num -> num % 2 == 0);System.out.println("First even number: " + firstEven); // 2// 查找第一個大于 10 的數 (找不到)Integer greaterThan10 = findFirstMatch(numbers, num -> num > 10);System.out.println("First number > 10: " + greaterThan10); // null}
}

? 枚舉應用答案 ?

3.Size 枚舉定義:

public enum Size {SMALL,MEDIUM,LARGE
}

4.帶寬度范圍的 Size 枚舉:

public enum Size {SMALL(0, 50),MEDIUM(51, 100),LARGE(101, Integer.MAX_VALUE); // 使用 Integer.MAX_VALUE 表示無上限private final int minWidth;private final int maxWidth;private Size(int minWidth, int maxWidth) {this.minWidth = minWidth;this.maxWidth = maxWidth;}public int getMinWidth() {return minWidth;}public int getMaxWidth() {return maxWidth;}// 可以添加一個方法來判斷某個寬度屬于哪個 Sizepublic static Size getFittingSize(int width) {for (Size size : values()) {if (width >= size.getMinWidth() && width <= size.getMaxWidth()) {return size;}}// 理論上,如果定義完整,總能找到一個,但可以加個默認或拋異常return SMALL; // 或者拋出 IllegalArgumentException}
}// 使用示例
public class SizeDemo {public static void main(String[] args) {Size s = Size.MEDIUM;System.out.println("Medium min width: " + s.getMinWidth()); // 51System.out.println("Medium max width: " + s.getMaxWidth()); // 100int currentWidth = 75;Size fitting = Size.getFittingSize(currentWidth);System.out.println("Width " + currentWidth + " fits in size: " + fitting); // MEDIUM}
}

? 概念理解答案 ?

5.類型擦除 (Type Erasure):是的,它是 Java 泛型實現的一部分。為了兼容沒有泛型的老代碼,Java 編譯器在編譯后會“擦除”掉大部分泛型的類型信息(類型參數會被替換成它們的上界,通常是 Object)。這意味著在運行時,JVM 其實并不知道 ArrayList<String>ArrayList<Integer> 的區別(它們都是 ArrayList)。
影響

  • 我們不能在運行時獲取泛型參數的實際類型(如 list instanceof ArrayList<String>非法的)。
  • 不能創建泛型數組(如 new T[]不允許的,通常用 new Object[] 再強轉)。
  • 不能實例化類型參數(如 new T()不行的,除非有特殊約束如 Class<T>)。
  • 靜態上下文中不能使用類的類型參數。

枚舉繼承實現

  • 不能 extends 另一個 🚫:所有的枚舉隱式地繼承java.lang.Enum 類,由于 Java 是單繼承的,所以枚舉不能再繼承其他類。
  • 可以 implements 接口 ?:這是一個非常強大的特性!枚舉可以實現一個或多個接口,使得不同的枚舉常量可以有不同的行為實現(通常結合接口方法在每個常量內部匿名實現,或者定義一個統一的實現)。

恭喜你又解鎖了 Java 的兩個重要技能!泛型枚舉在實際項目中應用非常廣泛,多加練習,它們會讓你的代碼水平更上一層樓!🚀 如果覺得這篇筆記有幫助,點贊👍、收藏?、關注就是對我最好的肯定!謝謝大家!💖

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

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

相關文章

新能源行業供應鏈規劃及集成計劃報告(95頁PPT)(文末有下載方式)

資料解讀&#xff1a;《數字化供應鏈規劃及集成計劃現狀評估報告》 詳細資料請看本解讀文章的最后內容。 該報告圍繞新能源行業 XX 企業供應鏈展開&#xff0c;全面評估其現狀&#xff0c;剖析存在的問題&#xff0c;并提出改進方向和關鍵舉措&#xff0c;旨在提升供應鏈競爭力…

Centos 7 yum配置出現一下報錯:

One of the configured repositories failed (CentOS-$releaserver-Base), and yum doesnt have enough cached data to continue. At this point the only safe thing yum can do is fail. There are a few ways to work "fix" this: 1.解決CentOS Yum Repositor…

Redis 常見問題深度剖析與全方位解決方案指南

Redis 是一款廣泛使用的開源內存數據庫&#xff0c;在實際應用中常會遇到以下一些常見問題&#xff1a; 1.內存占用問題 問題描述&#xff1a;隨著數據量的不斷增加&#xff0c;Redis 占用的內存可能會超出預期&#xff0c;導致服務器內存不足&#xff0c;影響系統的穩定性和…

HOOK上癮思維模型——AI與思維模型【88】

一、定義 HOOK上癮思維模型是一種通過設計一系列的觸發&#xff08;Trigger&#xff09;、行動&#xff08;Action&#xff09;、獎勵&#xff08;Reward&#xff09;和投入&#xff08;Investment&#xff09;環節&#xff0c;來促使用戶形成習慣并持續使用產品或服務的思維框…

【playwright】內網離線部署playwright

背景&#xff1a;安裝好python3.9后&#xff0c;由于內網無法使用pip安裝playwright&#xff0c;多方收集資料&#xff0c;終于部署完成&#xff0c;現匯總如下&#xff1a; 1、playwright需要python3.7以上的版本&#xff0c;如果低于這個版本先要將python解釋器升級 2、在可…

Unity動態列表+UniTask異步數據請求

Unity動態列表UniTask異步數據請求 很久沒有寫東西了。最近有一個需求&#xff0c;在Unity項目里&#xff0c;有幾個比較長的列表&#xff0c;經歷了一翻優化&#xff0c;趁這幾日閑暇&#xff0c;記錄下來&#xff0c;給自己留個筆記&#xff0c;也送給有緣之人共同探討吧。 …

pandas讀取Excel數據(.xlsx和.xls)到treeview

對于.xls文件&#xff0c;xlrd可能更合適&#xff0c;但需要注意新版本的xlrd可能不支持xlsx&#xff0c;不過用戶可能同時需要處理兩種格式&#xff0c;所以可能需要結合openpyxl和xlrd&#xff1f;或者直接用pandas&#xff0c;因為它內部會處理這些依賴。 然后&#xff0c;…

2025年Jetpack Compose集成網絡請求庫的完整實施方案

Compose中集成網絡請求庫&#xff0c;網絡請求現在Retrofit是最流行的。 首先在Compose中如何進行網絡請求&#xff0c;而不僅僅是集成庫。因為Compose本身是UI框架&#xff0c;網絡請求其實還是通過ViewModel或者Repository來處理&#xff0c;然后通過狀態管理來更新UI。所以…

機器視覺開發-攝像頭掃描二維碼

以下是使用Python和OpenCV實現攝像頭掃描二維碼的最簡單示例&#xff1a; import cv2 from pyzbar import pyzbar# 打開攝像頭 cap cv2.VideoCapture(0)print("正在掃描二維碼... (按 q 鍵退出)")while True:# 讀取攝像頭幀ret, frame cap.read()if not ret:print…

Seata服務端回滾事務核心源碼解析

文章目錄 前言一、doGlobalRollback3.1、changeGlobalStatus3.2、doGlobalRollback 前言 本篇介紹Seata服務端接收到客戶端TM回滾請求&#xff0c;進行處理并且驅動所有的RM進行回滾的源碼。 一、doGlobalRollback doGlobalRollback是全局回滾的方法&#xff1a; ??首先依舊…

新聞客戶端案例的實現,使用axios獲取數據并渲染頁面,路由傳參(查詢參數,動態路由),使用keep-alive實現組件緩存

文章目錄 0.頁面要求1.功能要求2.開始路由配置2.1.嵌套二級路由如何配置?2.2.路由重定向,NotFound頁面,去除"#"號 3.實現底部導航欄的高亮效果4.渲染首頁:使用axios請求數據5.路由傳參5.1.回顧:查詢參數傳參或者動態路由傳參5.2.具體代碼 6.渲染詳情頁7.解決請求過程…

文件操作--文件包含漏洞

本文主要內容 腳本 ASP、PHP、JSP、ASPX、Python、Javaweb --# 各種包含函數 檢測 白盒 代碼審計 黑盒 漏掃工具、公開漏洞、手工看參數值及功能點 類型 本地包含 有限制、無限制 遠程包含 無限制、有限制…

ActiveMQ 性能優化與網絡配置實戰(二)

五、性能優化實戰 5.1 基礎配置調整 5.1.1 增加并發消費者 在 ActiveMQ 中&#xff0c;增加并發消費者是提高消息處理效率的重要手段之一。通過配置多個消費者并行處理消息&#xff0c;可以充分利用系統資源&#xff0c;加快消息的消費速度&#xff0c;從而提高系統的整體吞…

C++/SDL 進階游戲開發 —— 雙人塔防(代號:村莊保衛戰 17)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄 二…

貪心算法精解(Java實現):從理論到實戰

一、貪心算法概述 貪心算法&#xff08;Greedy Algorithm&#xff09;是一種在每一步選擇中都采取當前狀態下最優決策的算法策略。它通過局部最優選擇來達到全局最優解&#xff0c;具有高效、簡潔的特點。 核心特點&#xff1a; 局部最優選擇&#xff1a;每一步都做出當前看…

深度學習框架:PyTorch使用教程 !!

文章目錄 一、PyTorch框架簡介 1.1 什么是PyTorch 1.2 PyTorch的優勢 二、從入門到精通的PyTorch使用教程 2.1 入門階段 2.1.1 環境安裝與配置 2.1.2 Tensor基礎操作 2.1.3 自動求導&#xff08;Autograd&#xff09; 2.1.4 構建神經網絡&#xff08;nn模塊&#xff09; 2.1.5 …

系統架構設計師:設計模式——創建型設計模式

一、創建型設計模式 創建型模式抽象了實例化過程&#xff0c;它們幫助一個系統獨立于如何創建、組合和表示它的那些對象。一個類創建型模式使用繼承改變被實例化的類&#xff0c;而一個對象創建型模式將實例化委托給另一個對象。 隨著系統演化得越來越依賴于對象復合而不是類…

Dinero.js - 免費開源的 JavaScript 貨幣處理工具庫,完美解決 JS 浮點數精度丟失問題

今天介紹一個在前后端處理貨幣的工具庫&#xff0c;logo 很可愛&#xff0c;是一只藍色的招財小貓。 本文封面圖底圖來自免費 AI 圖庫 StockCake。 Dinero.js 是一個用于貨幣計算的 JavaScript 工具庫&#xff0c;解決開發者在金融、電商、會計等場景中處理貨幣時的精度丟失、…

HNUST湖南科技大學-嵌入式考試選擇題題庫(109道糾正詳解版)

HNUST嵌入式選擇題題庫 1.下面哪點不是嵌入式操作系統的特點。(B) A.內核精簡 B.功能強大 C.專用性強 D.高實時性 解析&#xff1a; 嵌入式操作系統特點是內核精簡、專用性強、高實時性&#xff0c;而"功能強大"通常指的是通用操作系統&#x…

【工具】Windows批量文件復制教程:用BAT腳本自動化文件管理

一、引言 在日常開發與部署過程中&#xff0c;文件的自動化復制是一個非常常見的需求。無論是在構建過程、自動部署&#xff0c;還是備份任務中&#xff0c;開發者經常需要將某個目錄中的 DLL、配置文件、資源文件批量復制到目標位置。相比使用圖形界面的復制粘貼操作&#xf…