JavaSE 集合從入門到面試:全面解析與實戰指南

JavaSE 集合從入門到面試:全面解析與實戰指南

在 Java 編程中,集合是處理數據的核心工具,幾乎所有 Java 應用都會用到集合框架。從簡單的列表存儲到復雜的數據分析,集合框架提供了豐富的數據結構和操作方法。本文將從基礎概念到面試考點,全方位剖析 JavaSE 集合框架,幫助你構建完整的知識體系。

一、集合框架概述:為什么需要集合?

在 Java 中,數組是最基本的數據存儲結構,但數組存在明顯局限性:長度固定、只能存儲同類型元素、缺乏常用操作方法(如添加、刪除、查找)。集合框架的出現正是為了彌補這些不足,它提供了一系列靈活的數據結構,能夠動態存儲不同類型的元素,并內置了豐富的操作方法。

Java 集合框架(Java Collections Framework)位于 java.util 包下,主要包含三大塊:接口(如 CollectionMap)、實現類(如 ArrayListHashMap)、工具類(如 Collections)。其核心思想是面向接口編程,通過接口定義規范,不同的實現類提供不同的功能,滿足多樣化的業務需求。

二、集合框架整體結構:一張圖看懂核心體系

集合框架的核心接口可以分為兩大分支:CollectionMap,它們分別代表不同的數據結構:

java.util
├─ Collection(單值集合,存儲單個元素)
│  ├─ List(有序、可重復)
│  │  ├─ ArrayList(動態數組實現)
│  │  ├─ LinkedList(雙向鏈表實現)
│  │  └─ Vector(線程安全的動態數組,古老類)
│  │     └─ Stack(棧,繼承自Vector)
│  │
│  ├─ Set(無序、不可重復)
│  │  ├─ HashSet(哈希表實現)
│  │  │  └─ LinkedHashSet(有序的HashSet,維護插入順序)
│  │  └─ TreeSet(紅黑樹實現,元素可排序)
│  │
│  └─ Queue(隊列,先進先出)
│     ├─ LinkedList(雙向鏈表實現,可作隊列/雙端隊列)
│     └─ PriorityQueue(優先級隊列,基于堆實現)
│
└─ Map(鍵值對集合,存儲鍵值映射)├─ HashMap(哈希表實現)│  └─ LinkedHashMap(有序的HashMap,維護插入順序)├─ TreeMap(紅黑樹實現,鍵可排序)└─ Hashtable(線程安全的哈希表,古老類)

核心接口的區別與聯系

  • Collection:存儲單個元素的集合,元素可以重復(List)或不可重復(Set),元素可以有序(List、LinkedHashSet)或無序(HashSet)。
  • Map:存儲鍵值對(key-value)的集合,鍵(key)不可重復,值(value)可以重復。Map 與 Collection 的主要區別是存儲方式不同,Map 通過鍵快速查找值,而 Collection 直接存儲元素。

三、List 接口:有序可重復的動態數組

List 接口繼承自 Collection,是最常用的集合類型之一,其核心特點是元素有序(插入順序與存儲順序一致)、可重復,并允許通過索引訪問元素。

1. ArrayList:數組的動態實現

ArrayList 是 List 接口的主要實現類,底層基于動態數組實現,能夠根據元素數量自動擴容。

核心特點
  • 查詢快:通過索引直接訪問元素,時間復雜度為 O(1)。
  • 增刪慢:在中間位置添加或刪除元素時,需要移動后續元素,時間復雜度為 O(n)。
  • 線程不安全:多線程環境下可能出現并發問題,如需線程安全可使用 Collections.synchronizedList()CopyOnWriteArrayList
底層原理:動態擴容機制

ArrayList 的初始容量為 10(JDK 8 及以上),當元素數量超過當前容量時,會觸發擴容:

  1. 計算新容量:新容量 = 舊容量 + 舊容量 / 2(即擴容 1.5 倍)。
  2. 創建新數組,將舊數組元素復制到新數組。
  3. 替換引用,舊數組被垃圾回收。

注意:頻繁擴容會影響性能,因此在已知元素數量的情況下,建議初始化時指定容量(如 new ArrayList<>(100))。

常用操作示例
List<String> list = new ArrayList<>();
// 添加元素
list.add("Java");
list.add("Python");
// 插入元素到指定位置
list.add(1, "C++");
// 獲取元素
String element = list.get(0);
// 修改元素
list.set(2, "JavaScript");
// 刪除元素
list.remove(1);
// 遍歷元素
for (String s : list) {System.out.println(s);
}

2. LinkedList:雙向鏈表的靈活實現

LinkedList 底層基于雙向鏈表實現,每個節點包含前驅指針(prev)、數據(data)和后繼指針(next)。

核心特點
  • 增刪快:在鏈表頭部或尾部添加/刪除元素時,時間復雜度為 O(1);在中間位置操作時,需先查找位置,時間復雜度為 O(n)。
  • 查詢慢:訪問指定索引的元素時,需要從頭或尾遍歷,時間復雜度為 O(n)。
  • 功能豐富:實現了 Deque 接口,可作為隊列(Queue)、雙端隊列(Deque)或棧(Stack)使用。
作為隊列和棧的使用示例
// 作為隊列(先進先出)
Queue<String> queue = new LinkedList<>();
queue.offer("A"); // 添加元素到隊尾
queue.offer("B");
String head = queue.poll(); // 移除并返回隊頭元素// 作為棧(后進先出)
Deque<String> stack = new LinkedList<>();
stack.push("X"); // 添加元素到棧頂
stack.push("Y");
String top = stack.pop(); // 移除并返回棧頂元素

3. ArrayList 與 LinkedList 的選擇

  • 頻繁查詢、少增刪:選 ArrayList
  • 頻繁增刪(尤其是頭部/尾部)、少查詢:選 LinkedList
  • 大多數業務場景中,ArrayList 的性能更優,是首選。

四、Set 接口:無序不可重復的集合

Set 接口繼承自 Collection,其核心特點是元素不可重復(通過 equals()hashCode() 判斷)、無序(存儲順序與插入順序無關,LinkedHashSet 除外)。

1. HashSet:哈希表的高效實現

HashSet 是 Set 接口的主要實現類,底層基于哈希表(HashMap)實現,通過哈希值快速定位元素。

核心特點
  • 無序性:元素存儲順序與插入順序無關。
  • 唯一性:通過 hashCode()equals() 保證元素不重復。
  • 高效性:添加、刪除、查找元素的平均時間復雜度為 O(1)。
  • 線程不安全:多線程環境下需額外處理線程安全問題。
去重原理:hashCode() 與 equals() 的協作

HashSet 判斷元素是否重復的規則:

  1. 先比較兩個元素的 hashCode() 值,若不同,則認為是不同元素。
  2. hashCode() 值相同,再調用 equals() 方法,若返回 true,則認為是相同元素(不添加);若返回 false,則認為是不同元素(發生哈希沖突,通過鏈表或紅黑樹存儲)。

重寫規范

  • 若兩個對象 equals() 返回 true,則 hashCode() 必須相等。
  • 若兩個對象 hashCode() 不等,則 equals() 一定返回 false
示例:自定義對象去重
class Student {private String id;private String name;// 構造方法、getter、setter省略@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return Objects.equals(id, student.id); // 按id去重}@Overridepublic int hashCode() {return Objects.hash(id); // 基于id計算哈希值}
}// 使用HashSet存儲Student
Set<Student> students = new HashSet<>();
students.add(new Student("1", "張三"));
students.add(new Student("1", "張三")); // 重復,不會被添加

2. LinkedHashSet:有序的 HashSet

LinkedHashSet 繼承自 HashSet,底層通過哈希表 + 雙向鏈表實現,既保證了元素的唯一性,又維護了元素的插入順序。

其性能略低于 HashSet(因需維護鏈表),但在需要有序性的場景下非常實用。

3. TreeSet:可排序的 Set

TreeSet 底層基于紅黑樹(一種自平衡二叉查找樹)實現,能夠對元素進行自然排序或自定義排序。

排序方式
  • 自然排序:元素類實現 Comparable 接口,重寫 compareTo() 方法。
  • 自定義排序:創建 TreeSet 時傳入 Comparator 對象,定義排序規則。
示例:自定義排序
// 自然排序:Student實現Comparable
class Student implements Comparable<Student> {private String id;private int age;@Overridepublic int compareTo(Student o) {return this.age - o.age; // 按年齡升序排序}
}// 自定義排序:按id長度降序
Set<Student> treeSet = new TreeSet<>((s1, s2) -> s2.getId().length() - s1.getId().length()
);

五、Map 接口:鍵值對的映射關系

Map 接口用于存儲鍵值對(key-value),其中鍵(key)不可重復,值(value)可以重復,鍵和值都可以為 null(HashMap 允許,Hashtable 不允許)。

1. HashMap:哈希表的鍵值實現

HashMap 是 Map 接口的主要實現類,底層基于哈希表(數組 + 鏈表 / 紅黑樹)實現,通過鍵的哈希值快速定位值。

JDK 8 中 HashMap 的結構
  • 底層是數組(稱為 “桶”),每個桶中存儲鏈表或紅黑樹。
  • 當鏈表長度超過 8 且數組容量≥64 時,鏈表會轉換為紅黑樹(提高查詢效率)。
  • 當紅黑樹節點數少于 6 時,會轉回鏈表。
核心特點
  • 無序性:鍵值對的存儲順序與插入順序無關。
  • 高效性:添加、刪除、查找的平均時間復雜度為 O(1)。
  • 線程不安全:多線程環境下可能出現 ConcurrentModificationException,需使用 ConcurrentHashMap
擴容機制

HashMap 的初始容量為 16,負載因子為 0.75(當元素數量超過容量 × 負載因子時觸發擴容)。擴容時,新容量為舊容量的 2 倍,并重新計算所有鍵的哈希值,將元素轉移到新數組中。

常用操作示例
Map<String, Integer> map = new HashMap<>();
// 添加鍵值對
map.put("Java", 100);
map.put("Python", 90);
// 獲取值
int javaScore = map.get("Java");
// 判斷鍵是否存在
boolean hasPython = map.containsKey("Python");
// 遍歷鍵值對
for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 遍歷鍵
for (String key : map.keySet()) {System.out.println(key);
}
// 遍歷值
for (int value : map.values()) {System.out.println(value);
}

2. LinkedHashMap:有序的 HashMap

LinkedHashMap 繼承自 HashMap,底層通過哈希表 + 雙向鏈表實現,在 HashMap 的基礎上維護了鍵值對的插入順序或訪問順序。

  • 插入順序:默認模式,按鍵值對的插入順序排序。
  • 訪問順序:調用 get() 方法訪問元素后,該元素會被移到鏈表尾部,適用于實現 LRU(最近最少使用)緩存。
示例:LRU 緩存實現
// 最大容量為3,按訪問順序排序
Map<String, String> lruCache = new LinkedHashMap<>(3, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry<String, String> eldest) {// 當元素數量超過3時,移除最久未訪問的元素return size() > 3;}
};

3. TreeMap:可排序的 Map

TreeMap 底層基于紅黑樹實現,能夠根據鍵對鍵值對進行自然排序或自定義排序,與 TreeSet 類似。

其鍵必須實現 Comparable 接口或通過 Comparator 指定排序規則,適合需要對鍵進行排序的場景。

4. HashMap 與 Hashtable 的區別

特性HashMapHashtable
線程安全不安全安全(方法加 synchronized)
效率
允許 null 鍵/值允許(鍵只能有一個 null)不允許
初始容量16,擴容為 2 倍11,擴容為 2n+1
父類AbstractMapDictionary(古老類)

六、集合工具類:Collections 與 Arrays

1. Collections:集合操作工具類

Collections 提供了大量靜態方法,用于操作 Collection 和 Map,常用方法包括:

  • 排序sort(list)sort(list, comparator)
  • 查找binarySearch(list, key)(二分查找,需先排序)
  • 同步化synchronizedList(list)synchronizedMap(map)(將非線程安全集合轉為線程安全)
  • 不可變集合unmodifiableList(list)unmodifiableMap(map)(返回只讀視圖)
  • 其他reverse(list)(反轉)、shuffle(list)(隨機打亂)
示例:創建不可變集合
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
// 返回不可變視圖,修改會拋出UnsupportedOperationException
List<String> unmodifiableList = Collections.unmodifiableList(list);

2. Arrays:數組操作工具類

Arrays 提供了數組操作的靜態方法,常用方法包括:

  • 排序sort(array)
  • 轉換為集合asList(array)(返回固定大小的 List,不能添加/刪除元素)
  • 填充fill(array, value)
  • 比較equals(array1, array2)
  • 二分查找binarySearch(array, key)
示例:數組與集合的轉換
String[] array = {"a", "b", "c"};
// 數組轉集合(返回的是Arrays.ArrayList,不是java.util.ArrayList)
List<String> list = Arrays.asList(array);
// 如需操作集合,需轉為ArrayList
List<String> arrayList = new ArrayList<>(Arrays.asList(array));

七、面試高頻考點解析

1. 集合框架常見面試題

Q1:ArrayList 與 Vector 的區別?

A:兩者都基于動態數組實現,主要區別在于:

  • Vector 是線程安全的(方法加 synchronized),ArrayList 線程不安全。
  • Vector 初始容量為 10,擴容時默認翻倍;ArrayList 初始容量為 10,擴容為 1.5 倍。
  • Vector 是古老類(JDK 1.0),ArrayList(JDK 1.2)是其替代者,性能更優。

Q2:HashMap 的底層實現原理(JDK 7 vs JDK 8)?

A:JDK 7 中 HashMap 由數組 + 鏈表實現;JDK 8 中引入紅黑樹優化,當鏈表長度超過 8 且數組容量≥64 時,鏈表轉為紅黑樹,提高查詢效率(從 O(n) 優化為 O(log n))。

Q3:ConcurrentHashMap 與 Hashtable 的線程安全實現方式有何不同?

A:Hashtable 通過在方法上添加 synchronized 關鍵字實現線程安全,每次操作都鎖定整個對象,并發效率低;ConcurrentHashMap 在 JDK 7 中通過分段鎖(Segment) 實現,將哈希表分為多個段,每個段獨立加鎖,支持多線程同時操作不同段;JDK 8 中摒棄分段鎖,采用 CAS + synchronized 實現,對鏈表頭部或紅黑樹的根節點加鎖,并發效率更高。

Q4:Iterator 的 fail-fast 機制是什么?

A:fail-fast(快速失敗)是 Iterator 的一種錯誤檢測機制,當集合在迭代過程中被修改(如添加、刪除元素),會拋出 ConcurrentModificationException。其原理是集合內部維護一個 modCount 變量,記錄修改次數,迭代器初始化時復制該值到 expectedModCount,每次迭代都檢查兩者是否相等,不等則拋出異常。

注意:通過迭代器的 remove() 方法修改集合不會觸發 fail-fast。

Q5:List 的 subList() 方法返回的是什么?

AsubList() 返回原集合的視圖(不是新集合),對 subList 的修改會影響原集合,反之亦然。subList 依賴原集合存在,若原集合被修改(如 add、clear),subList 的操作會拋出 ConcurrentModificationException

2. 集合設計思想與源碼分析

為什么 Collection 和 Map 是頂層接口而非類?

Java 集合框架采用接口 + 實現的設計模式,接口定義規范,實現類提供具體實現。不同數據結構(如數組、鏈表、哈希表)的操作方式不同,用接口可以統一 API,方便開發者切換實現類(如從 ArrayList 改為 LinkedList 只需修改初始化代碼)。

HashMap 的哈希函數如何設計?

JDK 8 中 HashMap 的哈希函數為:(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)。通過將哈希值的高 16 位與低 16 位異或,混合哈希值的高位和低位,減少哈希沖突(尤其在數組容量較小時)。

八、集合性能優化策略

1. 初始化時指定容量

對于 ArrayList、HashMap 等集合,初始化時根據預期元素數量指定容量,減少擴容次數。例如:

// 已知需要存儲1000個元素
List<String> list = new ArrayList<>(1000);
Map<String, Integer> map = new HashMap<>(2000); // HashMap容量需為2的冪,2000接近2048

2. 選擇合適的集合類型

  • 頻繁包含/排除操作:用 HashSet(contains 方法 O(1)),避免用 ArrayList(contains 方法 O(n))。
  • 存儲鍵值對且需要排序:用 TreeMap,無需排序用 HashMap。
  • 多線程讀多寫少:用 CopyOnWriteArrayList(讀不加鎖,寫時復制)。

3. 避免自動裝箱拆箱

優先使用基本類型數組或泛型指定基本類型包裝類,避免頻繁自動裝箱拆箱(如 ArrayList<Integer>add(int) 會自動裝箱為 Integer)。

4. 合理使用不可變集合

對于不需要修改的集合,使用 Collections.unmodifiableXXX() 或 JDK 9 的 List.of()Map.of() 創建不可變集合,提高安全性和性能(不可變集合無需考慮并發修改)。

九、總結:集合框架的學習路徑

掌握 Java 集合框架需要經歷三個階段:

  1. 入門階段:熟悉常用集合(ArrayList、HashMap、HashSet)的基本用法,能根據場景選擇合適的集合。
  2. 進階階段:理解底層數據結構(數組、鏈表、哈希表、紅黑樹),掌握擴容機制、哈希沖突解決等原理。
  3. 深入階段:閱讀源碼(如 HashMap 的 put 方法、ArrayList 的 grow 方法),理解設計思想(如接口隔離、開閉原則),能分析性能瓶頸并優化。

集合框架是 Java 開發的基石,無論是日常開發還是面試,都占據重要地位。學習時應結合理論與實踐,通過源碼分析加深理解,通過性能測試驗證選擇,讓集合成為提升代碼效率的利器而非瓶頸。

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

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

相關文章

自建云音樂服務器:Navidrome+cpolar讓無損音樂隨身聽

文章目錄前言1. 安裝Docker2. 創建并啟動Navidrome容器3. 公網遠程訪問本地Navidrome3.1 內網穿透工具安裝3.2 創建遠程連接公網地址3.3 使用固定公網地址遠程訪問前言 “想聽自己的無損音樂還要開會員&#xff1f;”——音樂發燒友小王的煩惱。商業音樂平臺音質壓縮&#xff…

C3P0連接池適配HGDB

文章目錄文檔用途詳細信息文檔用途 講解常用的并且需要與數據庫進行交互的開源框架C3P0&#xff0c;以及C3P0框架是如何適配HGDB的。 詳細信息 1.C3P0概述 C3P0是一個開源的JDBC連接池&#xff0c;它實現了數據源和JNDI綁定&#xff0c;支持JDBC3規范和JDBC2的標準擴展。目…

ZeroGPU Spaces 加速實踐:PyTorch 提前編譯全解析

ZeroGPU 讓任何人都能在 Hugging Face Spaces 中使用強大的 Nvidia H200 硬件&#xff0c;而不需要因為空閑流量而長期占用 GPU。 它高效、靈活&#xff0c;非常適合演示&#xff0c;不過需要注意的是&#xff0c;ZeroGPU 并不能在所有場景下完全發揮 GPU 與 CUDA 棧的全部潛能…

8.ImGui-輸入框

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;7.ImGui-單選框和復選框 單行輸入框使用 ImGui::InputText()&#xff0c;下圖中…

2025年- H120-Lc28. 找出字符串中第一個匹配項的下標(數組)--Java版

1.題目2.思路 短的子串相對不變 所以我們用長的字符串去截取in個長度的子串做遍歷 如果兩者相等 返回字符串第一個匹配項的索引的下標 3.代碼實現 class Solution {public int strStr(String haystack, String needle) {int s1haystack.length();int s2needle.length();//遍歷最…

uport1100系列轉接頭,SZ系列光電編碼器RS485通信

安裝uport1100系列轉接頭驅動 &#xff1a;選擇對應自己系統內核版本的驅動。否則爆出系統內核過高過低等問題。 查看系統內核版本指令&#xff1a; uname -r #簡要 uname -a #詳細驅動下載官網&#xff1a; https://www.moxa.com.cn/support/product-support/software-and-…

Java全棧開發面試實戰:從基礎到微服務架構

Java全棧開發面試實戰&#xff1a;從基礎到微服務架構 在一次互聯網大廠的Java全棧開發崗位面試中&#xff0c;一位名叫李明的28歲程序員&#xff0c;擁有計算機科學與技術本科學歷&#xff0c;工作年限為5年。他的主要職責包括設計和實現前后端分離的Web應用、參與微服務架構的…

win10(三)視頻剪裁

上傳一刻相冊&#xff0c;有30M大小限制。這個軟件能免費剪裁視頻而且支持手機的H.265格式&#xff0c;這個格式目前連potplayer都支持不好。但是配合FFmpeg可以檢測并且能按大小&#xff08;或時間&#xff09;剪裁&#xff0c;并上傳到一刻相冊上播放。 下載FFmpeg的方法&am…

Linux--線程

Linux線程概念 1 什么是線程 ? 在?個程序?的?個執?路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“?個進程內部 的控制序列” ? ?切進程?少都有?個執?線程 ? 線程在進程內部運?&#xff0c;本質是在進程地址空間內運? ? 在L…

【C++】C++11的包裝器:function與bind簡介

各位大佬好&#xff0c;我是落羽&#xff01;一個堅持不斷學習進步的學生。 如果您覺得我的文章還不錯&#xff0c;歡迎多多互三分享交流&#xff0c;一起學習進步&#xff01; 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄一、function1. 概念2. 用法二、bind1. 概念2. 用法…

MySQL高級特性詳解

MySQL高級特性詳解 一、自關聯查詢 概念 自關聯查詢是指一個表與它自己進行連接的查詢。通常用于處理具有層級關系或遞歸結構的數據。 應用場景 員工與上級關系分類的父子關系地區的層級關系 示例 -- 創建員工表 CREATE TABLE employees (emp_id INT PRIMARY KEY,emp_name VARC…

深度學習——調整學習率

學習率調整方法詳解在深度學習訓練過程中&#xff0c;學習率&#xff08;Learning Rate, LR&#xff09; 是影響模型收斂速度和效果的關鍵超參數。學習率過大可能導致訓練不穩定、震蕩甚至無法收斂&#xff1b;學習率過小又會導致收斂過慢甚至陷入局部最優。因此&#xff0c;如…

Java分頁 Element—UI

前端代碼 <div class"block"><span class"demonstration">頁數較少時的效果</span><el-paginationlayout"prev, pager, next":total"50"></el-pagination> </div>參考Element-UI total:0, form: …

html中列表和表格的使用

列表一般來說只有一列一列的進行使用&#xff0c;是一維的列表分為三種列表形式<!-- 列表標簽ul-li:無序列表&#xff0c;必須用 <ul> 當 “容器”&#xff08;代表 “無序列表”&#xff09;&#xff0c;每個條目用 <li> 包起來&#xff08;代表 “列表項”&am…

大學信息查詢平臺:一個現代化的React教育項目

一 項目簡介大學信息查詢平臺是一個基于React Vite Tailwind CSS構建的現代化Web應用&#xff0c;專門用于查詢中國各大高校的詳細信息。該項目不僅功能實用&#xff0c;更在用戶體驗和界面設計上做到了極致。二 核心功能2.1. 智能大學搜索// 搜索功能核心代碼 const searchU…

代碼隨想錄算法訓練營第六天 - 哈希表2 || 454.四數相加II / 383.贖金信 / 15.三數之和 / 18.四數之和

代碼隨想錄算法訓練營第六天 - 哈希表2 || 454.四數相加II / 383.贖金信 / 15.三數之和 / 18.四數之和454.四數相加II解題思路383.贖金信自己解答&#xff1a;代碼隨想錄講解暴力做法哈希表15.三數之和雙指針優化改進18.四數之和自己的解答系統講解454.四數相加II 文檔講解&…

FPGA實現流水式排序算法

該算法采用雙調排序算法&#xff0c;是一種可流水的遞推算法&#xff0c;且算法的消耗時長可算&#xff0c;具體細節參考視頻&#xff1a; https://www.bilibili.com/video/BV1S3thzWEnh/?spm_id_from333.1387.homepage.video_card.click&vd_source69fb997b62efa60ae1add…

平衡車 -- MPU6050

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” 傳感器原理 此外&#xff0c;用陀螺儀獲取x,y,z軸的加速度。 初始化 我們現在對MPU6050進行初始化&#xff0c;MPU6050通過I2C總線與單片機進行通信&#xff0c;通過的是PB8和PB…

在電路浪涌測試中,TVS(瞬態電壓抑制二極管)的防護效果確實會受到陪測設備中去耦網絡(Decoupling Network,DN)的顯著影響

在電路浪涌測試中&#xff0c;TVS&#xff08;瞬態電壓抑制二極管&#xff09;的防護效果確實會受到陪測設備中去耦網絡&#xff08;Decoupling Network&#xff0c;DN&#xff09;的顯著影響&#xff0c;這一現象與浪涌能量的傳遞路徑、阻抗匹配及信號完整性密切相關。結合 AD…

Redis之分布式鎖與緩存設計

1、分布式鎖 1.1、超賣問題/*** 存在庫存超賣的不安全問題*/private void deductStock() {int stockTotal Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));if (stockTotal > 0) { // 這里存在多個線程、進程同時判斷通過&#xff0c;然后超買…