深入探索Java集合框架

在Java編程中,數據的組織和存儲是核心部分。為了更有效地管理和操作這些數據,Java提供了一個強大且靈活的集合框架(Java Collection Framework,JCF)。這個框架不僅簡化了數據結構的處理,還提供了高效的性能。在本文中,我們將深入探討Java集合框架的組成、特性和用法。

目錄

    • 一、Java集合框架的概述
    • 二、主要集合接口
      • 1. List接口
      • 2. Set接口
      • 3. Queue接口
      • 4. Deque接口
      • 5. Map接口
    • 三、迭代器
    • 四、工具類
    • 五、并發集合
      • 1. 阻塞式集合
      • 2. 非阻塞式集合
    • 六、總結

一、Java集合框架的概述

Java集合框架位于java.util包中,是Java編程語言的核心部分。它定義了幾種類型的集合,包括列表(List)、集合(Set)、隊列(Queue)、雙端隊列(Deque)以及映射(Map)。這些集合類型通過統一的接口和抽象類來實現,從而提供了對數據的一致視圖。

二、主要集合接口

在Java集合框架中,接口是定義集合行為的關鍵。它們為不同類型的集合提供了通用的方法和規范。以下是主要集合接口的詳細介紹:

1. List接口

List接口代表了一個有序集合,即元素在集合中的位置(索引)是有順序的,并且允許存儲重復的元素。List接口繼承自Collection接口,并添加了一些特定于列表的操作,如獲取指定位置的元素、替換元素、獲取列表的子列表等。

以下是List接口的一些常用實現類:

  1. ArrayList
    ArrayListList接口的一個動態數組實現,它允許在運行時增長和縮小。ArrayList內部使用數組來存儲元素,因此訪問元素(get和set操作)的時間復雜度是O(1)。然而,插入和刪除元素(特別是中間位置的元素)可能需要移動數組中的其他元素,因此時間復雜度可能是O(n)。ArrayList是非同步的,因此它不適合在多線程環境中使用,除非外部同步。

  2. LinkedList
    LinkedList是一個雙向鏈表實現,它實現了ListDeque接口。LinkedList在列表的開頭和結尾插入和刪除元素時提供了常數時間性能,但在訪問列表中的特定位置時則提供了線性時間性能。LinkedList還提供了額外的方法來操作列表的開頭和結尾,這些方法繼承自Deque接口。

  3. Vector
    Vector是一個類似于ArrayList的類,但它是同步的,這意味著它是線程安全的。Vector的每個方法都被synchronized修飾,因此在多線程環境中可以防止并發修改。然而,這種同步是有代價的,通常會導致性能下降。Vector還提供了一個可以增長其容量的機制,以便在添加大量元素時減少內存重新分配的次數。

  4. Stack
    StackVector的一個子類,它實現了標準的后進先出(LIFO)堆棧。Stack類提供了pushpoppeek等堆棧操作。盡管Stack繼承自Vector并且因此是線程安全的,但通常不建議在新的代碼中使用它,因為Deque接口及其實現(如ArrayDeque)提供了更完整、更靈活的堆棧和隊列操作,并且通常具有更好的性能。

  5. CopyOnWriteArrayList
    CopyOnWriteArrayList是一個線程安全的List實現,它在修改時復制底層數組,從而實現了讀寫分離。這種設計使得讀取操作可以在沒有鎖定的情況下進行,而寫入操作則通過創建底層數組的新副本來實現。這使得CopyOnWriteArrayList非常適合讀多寫少的場景。然而,由于寫入操作需要復制整個底層數組,因此當列表很大時,寫入操作的性能可能會很差。

  6. AbstractListAbstractSequentialList
    這些類是用于創建自定義List實現的抽象基類。AbstractList提供了List接口的部分實現,而AbstractSequentialList則是一個更簡單的實現,它只支持按順序訪問元素。開發人員可以擴展這些類來創建自己的列表實現,而無需從頭開始實現整個接口。

2. Set接口

Set接口代表了一個無序集合,即元素在集合中的位置沒有特定的順序,并且集合中的元素是唯一的,不允許存儲重復的元素。Set接口也繼承自Collection接口,并添加了一些特定于集合的操作,如添加元素、刪除元素、判斷元素是否存在于集合中等。

ListQueue不同,Set中的元素是無序的,并且每個元素只能出現一次。Java標準庫為Set接口提供了幾種實現類,下面是一些常用的實現:

  1. HashSet
    HashSetSet接口的一個實現類,它使用哈希表(實際上是HashMap的一個實例)來存儲元素。HashSet中的元素是無序的,并且不保證元素的迭代順序。它允許null元素,并且由于其基于哈希表的實現,插入和查找操作通常是非常快的。

  2. LinkedHashSet
    LinkedHashSet也是一個Set接口的實現類,它維護著一個運行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,即按照將元素插入到集合中的順序(插入順序)進行迭代。LinkedHashSet在迭代訪問方面比HashSet更快,但需要更多的內存。

  3. TreeSet
    TreeSet是一個基于紅黑樹的NavigableSet實現。TreeSet中的元素是有序的,排序順序可以是元素的自然順序,或者通過構造函數傳遞的Comparator來決定。TreeSet不允許null元素,并且它實現了SortedSet接口,這意味著它提供了一些方法來處理排序集合,如first(), last(), headSet(), tailSet()等。

  4. EnumSet
    EnumSet是一個專為枚舉類型設計的緊湊、高效的Set實現。在枚舉類型的集合非常大或者需要特別快的性能時使用它是很合適的。EnumSet中的所有元素都必須是單個枚舉類型的枚舉值。

  5. CopyOnWriteArraySet
    CopyOnWriteArraySet是一個線程安全的Set實現,它通過使用內部的CopyOnWriteArrayList來實現。任何修改操作(如addremove)都會導致底層數組被復制,因此它適用于讀操作遠多于寫操作的場景。

  6. ConcurrentSkipListSet
    ConcurrentSkipListSet是一個基于SkipList算法的無界并發NavigableSet實現。它的元素是有序的,排序順序可以是元素的自然順序,或者通過構造函數傳遞的Comparator來決定。這個類設計用于高并發的場景,其中多個線程可能同時訪問集合,并且至少有一個線程會修改它。

這些實現類提供了豐富的功能集,以滿足不同場景下的需求,從簡單的元素存儲到復雜的并發和排序操作。

3. Queue接口

Queue接口代表了一個隊列,即一種先進先出(FIFO)的數據結構。隊列中的元素按照它們被添加的順序進行排列,并且只能從隊列的頭部移除元素,只能從隊列的尾部添加元素。Queue接口也繼承自Collection接口,并添加了一些特定于隊列的操作,如添加元素到隊列、從隊列中移除元素、查看隊列的頭部和尾部元素等。

Java標準庫提供了幾種Queue接口的實現類,包括:

  1. LinkedListLinkedList類實現了Deque接口,而Deque接口擴展了Queue接口。因此,LinkedList可以用作隊列,其中元素按照先進先出(FIFO)的順序進行處理。它也可以用作棧,其中元素按照后進先出(LIFO)的順序進行處理。
  2. PriorityQueuePriorityQueue類實現了一個基于優先級的無界隊列。優先級隊列的元素根據它們的自然順序進行排序,或者根據傳遞給隊列構造函數的Comparator進行排序,具體取決于所使用的構造方法。優先級隊列不允許使用null元素。
  3. ArrayDequeArrayDeque是一個基于數組的雙端隊列,具有可預測的迭代順序。該隊列按 FIFO(先進先出)原則對元素進行排序。新元素插入到隊列的末尾,隊列檢索操作在隊列的開頭進行。
  4. ConcurrentLinkedQueueConcurrentLinkedQueue是一個基于鏈接節點的無界線程安全隊列,它使用高效的非阻塞算法進行設計。
  5. LinkedBlockingDequeLinkedBlockingQueueArrayBlockingQueuePriorityBlockingQueueDelayQueueSynchronousQueue:這些都是java.util.concurrent包下的并發隊列,用于多線程環境下的數據共享和傳輸。

需要注意的是,雖然LinkedList既實現了List接口也實現了Queue接口,但在使用時通常根據具體需求選擇將其視為列表還是隊列。

4. Deque接口

Deque(Double Ended Queue)接口代表了一個雙端隊列,即一種可以從兩端添加和移除元素的隊列。Deque接口繼承自Queue接口,并添加了一些特定于雙端隊列的操作,如從隊列的頭部添加元素、從隊列的尾部移除元素等。

以下是Deque接口的一些常用實現類:

  1. ArrayDeque
    ArrayDeque是一個基于動態數組的雙端隊列,它在內部使用一個循環數組來存儲元素。這個類在大多數操作上(添加、刪除和訪問)都提供了常數時間的性能。ArrayDeque沒有容量限制,它是根據需要動態擴展的。它是非同步的,不適用于多線程環境,除非進行外部同步。

  2. LinkedList
    LinkedList類也實現了Deque接口,除了可以作為雙端隊列使用外,它還是一個雙向鏈表。這意味著它可以高效地從隊列的兩端添加和刪除元素。與ArrayDeque相比,LinkedList在內存使用上更加靈活,因為它不需要連續的內存空間來存儲元素。然而,LinkedList在中間位置進行插入和刪除操作時性能更好,但如果主要用作隊列或棧,ArrayDeque通常更快。

  3. ConcurrentLinkedDeque
    ConcurrentLinkedDeque是一個線程安全的雙端隊列,它基于鏈接節點的無界線程安全隊列。此隊列按照 FIFO(先進先出)原則對元素進行排序。新元素插入到隊列的末尾,隊列檢索操作則是在隊列的開頭進行。然而,與LinkedList不同,ConcurrentLinkedDeque的設計使其支持高效的并發訪問。它使用了類似于ConcurrentLinkedQueue的高級并發控制技術。

  4. BlockingDeque 接口及其實現:
    BlockingDequeDequeBlockingQueue接口的結合,它定義了一個線程安全的雙端隊列,該隊列在嘗試檢索或刪除元素時會阻塞,直到隊列非空或可以插入元素為止。Java標準庫沒有直接提供BlockingDeque的具體實現類,但你可以通過java.util.concurrent包中的其他類(如LinkedBlockingDeque)來找到這樣的功能。

    • LinkedBlockingDeque
      LinkedBlockingDeque是一個基于鏈接節點的可選容量的阻塞雙端隊列。此隊列按 FIFO(先進先出)排序元素。它可以在隊列的兩端添加和刪除元素,并提供了可選的容量限制。當隊列為空時,獲取元素的線程將會阻塞,直到有其他線程插入新的元素;當隊列滿時,嘗試添加元素的線程將會阻塞,直到有其他線程刪除一些元素騰出空間。這使得LinkedBlockingDeque非常適合在生產者-消費者場景中使用。
import java.util.ArrayDeque;  
import java.util.Deque;  public class DequeExample {  public static void main(String[] args) {  Deque<String> deque = new ArrayDeque<>();  deque.push("A"); // 在隊列頭部插入元素  deque.push("B");  deque.offer("C"); // 在隊列尾部插入元素  System.out.println("Initial deque: " + deque);  String head = deque.pop(); // 移除并返回隊列頭部的元素  System.out.println("Removed from head: " + head);  System.out.println("Deque after pop: " + deque);  String tail = deque.pollLast(); // 移除并返回隊列尾部的元素  System.out.println("Removed from tail: " + tail);  System.out.println("Deque after pollLast: " + deque);  }  
}

5. Map接口

Map接口代表了一個鍵值對集合,即一種存儲鍵值對數據的數據結構。Map接口中的每個元素都包含一個鍵和一個與之相關聯的值。鍵在Map中是唯一的,不允許存儲重復的鍵。Map接口提供了一些特定于鍵值對的操作,如添加鍵值對、根據鍵獲取值、刪除鍵值對等。

以下是Map接口的一些常用實現類:

  1. HashMap
    HashMapMap接口的一個基于哈希表的實現,它允許null鍵和null值。HashMap提供了常數時間的性能來進行基本的操作(getput),假設哈希函數將元素適當地分布在桶中。然而,這并不意味著HashMap的所有操作都是O(1)的,特別是在哈希表需要進行重哈希(rehashing)以處理哈希沖突時。

  2. LinkedHashMap
    LinkedHashMapHashMap的一個子類,它維護了一個運行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,即按照將鍵-值對插入到映射中的順序(插入順序)或訪問順序進行迭代。因此,LinkedHashMap在迭代訪問方面比HashMap更快,但需要更多的內存。

  3. TreeMap
    TreeMap是一個基于紅黑樹的NavigableMap實現。TreeMap中的鍵是有序的,排序順序可以是鍵的自然順序,或者通過構造函數傳遞的Comparator來決定。TreeMap不允許null鍵(像HashMap一樣允許一個null鍵)。TreeMap提供了高效的鍵排序、范圍查詢和其他導航方法。

  4. Hashtable
    HashtableMap接口的一個遺留實現,它的所有公共方法都是同步的,因此它是線程安全的。但是,與HashMap相比,Hashtable的性能通常要低得多,因為同步操作會導致性能開銷。Hashtable不允許null鍵和null值。在現代Java應用中,通常建議使用ConcurrentHashMap來處理需要線程安全的映射。

  5. ConcurrentHashMap
    ConcurrentHashMap是一個線程安全的HashMap實現,它使用了分段鎖或其他并發控制技術(在Java 8及更高版本中,它使用了一種稱為CAS和synchronized的更精細的并發控制策略)來實現高并發性能。ConcurrentHashMap中的讀取操作可以在沒有鎖定的情況下進行,而寫入操作則通過鎖定部分映射來實現。這使得ConcurrentHashMap非常適合于讀多寫少的并發場景。

  6. IdentityHashMap
    IdentityHashMap是一個特殊的Map實現,它使用引用相等性(==)而不是對象相等性(equals()方法)來比較鍵。這意味著即使兩個鍵在內容上相等(即它們的equals()方法返回true),但如果它們不是同一個對象(即它們的引用不同),那么它們在IdentityHashMap中也被視為不同的鍵。這種映射在需要基于對象身份進行映射的罕見情況下非常有用。

  7. EnumMap
    EnumMap是一個專為枚舉類型設計的緊湊、高效的Map實現。在枚舉類型的映射非常大或者需要特別快的性能時使用它是很合適的。EnumMap中的所有鍵都必須是單個枚舉類型的枚舉值。它在內部使用一個位向量或數組來表示映射,這使得它在存儲和訪問方面都非常高效。但是,它只能用于枚舉鍵的映射,并且不允許使用null鍵。

三、迭代器

迭代器(Iterator)是Java集合框架中的一個關鍵概念。它提供了一種方法來訪問集合中的每個元素,而無需暴露該集合的底層表示。通過Iterator接口,我們可以順序地訪問集合中的元素,并執行添加、刪除等操作。

除了普通的Iterator外,Java集合框架還提供了ListIterator,它專為List接口設計,允許程序員在遍歷列表時添加和替換元素,以及雙向遍歷列表。

四、工具類

Java集合框架還提供了兩個實用的工具類:Arrays和Collections。這些類包含了許多靜態方法,用于操作數組和集合。例如,我們可以使用Arrays類的sort()方法對數組進行排序,或使用Collections類的shuffle()方法隨機打亂集合中的元素順序。

五、并發集合

在Java中,當需要在多線程環境下操作集合時,普通的集合類(如ArrayList、HashSet等)可能會因為并發修改導致數據不一致的問題。為了解決這個問題,Java集合框架提供了一系列支持并發操作的集合類,這些集合類被稱為并發集合。

并發集合主要分為兩類:阻塞式集合和非阻塞式集合。

1. 阻塞式集合

阻塞式集合是指當集合已滿或為空時,對集合進行添加或移除操作的線程會被阻塞,直到操作可以成功執行為止。典型的阻塞式集合實現類有:

  • LinkedBlockingDeque:一個基于鏈表的雙端阻塞隊列。它支持在隊列的兩端進行插入和移除操作,當隊列已滿時,添加操作的線程會被阻塞;當隊列為空時,移除操作的線程會被阻塞。
  • LinkedTransferQueue:一個基于鏈表的阻塞隊列,它支持在生產者和消費者之間進行數據的直接傳遞。如果消費者線程正在等待接收數據,而生產者線程正好生產了數據,那么生產者線程可以直接將數據傳遞給消費者線程,而不需要將數據先添加到隊列中。
  • PriorityBlockingQueue:一個支持優先級排序的阻塞隊列。隊列中的元素按照優先級進行排序,優先級最高的元素總是位于隊列的頭部。當隊列已滿時,添加操作的線程會被阻塞;當隊列為空時,移除操作的線程會被阻塞。
  • DelayQueue:一個支持延遲獲取的阻塞隊列。隊列中的元素只有在達到指定的延遲時間后才能被獲取。如果嘗試獲取未達到延遲時間的元素,獲取操作的線程會被阻塞。

2. 非阻塞式集合

非阻塞式集合是指在進行添加或移除操作時,如果操作不能立即執行,那么會立即返回一個結果(通常是null或拋出異常),而不會阻塞調用線程。典型的非阻塞式集合實現類有:

  • ConcurrentHashMap:一個支持并發操作的哈希表。它允許多個線程同時訪問和修改哈希表中的數據,而不會引起競爭條件。ConcurrentHashMap內部使用分段鎖技術來實現并發控制,每個段(Segment)都有自己的鎖,不同線程可以并發地訪問不同段中的數據。
  • ConcurrentSkipListMap:一個支持并發操作的跳表實現。跳表是一種可以在對數期望時間內完成搜索、插入、刪除等操作的數據結構。ConcurrentSkipListMap內部使用無鎖算法來實現并發控制,允許多個線程同時訪問和修改跳表中的數據而不會引起競爭條件。與ConcurrentHashMap相比,ConcurrentSkipListMap在需要保持元素有序的場景下更為適用。
  • CopyOnWriteArrayListCopyOnWriteArraySet:這兩個類分別是支持并發操作的動態數組和集合實現。它們采用寫時復制(Copy-On-Write)的策略來實現并發控制。當需要修改集合中的數據時,會先將數據復制一份,然后在復制品上進行修改,修改完成后再將指針指向新的復制品。這樣可以保證在修改過程中不會阻塞讀取操作的線程,因為讀取操作仍然可以訪問舊的集合數據。但是需要注意的是,由于寫時復制需要復制整個集合數據,因此在大規模數據集合的場景下可能會導致較高的內存開銷和性能損耗。

總的來說,Java的并發集合為多線程環境下的數據操作提供了強大的支持,使得開發人員可以更加容易地編寫出高效、安全、可靠的并發程序。在選擇具體的并發集合實現類時,需要根據具體的應用場景和需求來進行選擇。

六、總結

Java集合框架是一個強大且靈活的工具,它簡化了數據結構的處理,提高了代碼的可重用性和可維護性。通過掌握Java集合框架的接口、實現類和工具類,我們可以更加高效地組織和操作數據,從而提升Java應用程序的性能和質量。

希能幫助您更深入地理解Java集合框架的組成和用法。在實際編程中,請根據您的需求選擇合適的集合類型和實現類,并充分利用Java集合框架提供的工具和特性來優化您的代碼。

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

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

相關文章

Opencv基本操作 (上)

目錄 圖像基本操作 閾值與平滑處理 圖像閾值 圖像平滑處理 圖像形態學操作 圖像梯度計算 Sobel 算子 Canny 邊緣檢測 圖像金字塔與輪廓檢測 圖像輪廓 接口定義 輪廓繪制 輪廓特征與相似 模板匹配 傅里葉變換 傅里葉變換的作用 濾波 圖像基本操作 讀取圖像&…

GDPU 算法分析與設計 天碼行空 1

實驗1 排序算法的效率分析 一、【實驗目的】 &#xff08;1&#xff09;復習排序算法的實現過程&#xff1b; &#xff08;2&#xff09;設計平均與最壞情況下時間復雜度的數據環境并理解相關含義&#xff1b; &#xff08;3&#xff09;初步了解算法時間復雜度的分析方法。…

【Maven】Maven 基礎教程(二):Maven 的使用

《Maven 基礎教程》系列&#xff0c;包含以下 2 篇文章&#xff1a; Maven 基礎教程&#xff08;一&#xff09;&#xff1a;基礎介紹、開發環境配置Maven 基礎教程&#xff08;二&#xff09;&#xff1a;Maven 的使用 &#x1f60a; 如果您覺得這篇文章有用 ?? 的話&#…

Qt中關于信號與槽函數的思考

信號與槽函數的思考 以pushbutton控件為例&#xff0c;在主界面上放置一個pushbutton控件&#xff0c;點擊右鍵選擇關聯槽函數&#xff0c;關聯一個click函數&#xff0c;如下圖所示&#xff1a; 在該函數中&#xff0c;實現了一個點擊pushbutton按鈕后&#xff0c;彈出一個窗…

nginx使用詳解--反向代理

什么是反向代理&#xff1f; 正向代理&#xff1a; 一般的訪問流程是客戶端直接向目標服務器發送請求并獲取內容&#xff0c;使用正向代理后&#xff0c;客戶端改為向代理服務器發送請求&#xff0c;并指定目標服務器&#xff08;原始服務器&#xff09;&#xff0c;然后由代理…

在極狐GitLab 配置 SSL/https

本文作者 徐曉偉 說明 極狐GitLab https 使用的是 nginx 實現的本文使用的域名是IP 192.168.80.14&#xff08;原因&#xff1a;如果使用域名&#xff0c;必須擁有這個域名的所有權&#xff0c;并增加解析才可以&#xff0c;要不然在 Docker 容器中&#xff0c;無法使用域名檢…

go并發模式之----使用時順序模式

常見模式之二&#xff1a;使用時順序模式 定義 顧名思義&#xff0c;起初goroutine不管是怎么個先后順序&#xff0c;等到要使用的時候&#xff0c;需要按照一定的順序來&#xff0c;也被稱為未來使用模式 使用場景 每個goroutine函數都比較獨立&#xff0c;不可通過參數循環…

DOM 獲取父子節點

DOM 是以樹狀結構排列的&#xff0c;所以父子關系是相對的&#xff0c;當li為我們的目標節點的時候&#xff0c;ul為其父節點&#xff0c;其他li為它的兄弟節點&#xff0c;li里面包含的標簽為子節點&#xff0c;以此類推。 那我們如何找父節點&#xff1f; 元素.parentNode&am…

libigl 網格質量矩陣

文章目錄 一、簡介二、應用三、實現效果參考資料一、簡介 在 libigl 中,igl::massmatrix 是一個用于計算給定三角網格的質量矩陣的函數。質量矩陣在有限元分析和其他模擬技術中非常有用,它通常用于描述網格中各個節點的質量或者用于計算模擬過程中的慣性效應。 igl::massmatr…

分布式系統如何做數據對賬?

前言 在分布式系統中&#xff0c;雖然我們會使用各種分布式事務的方案&#xff0c;來保證各個系統之間的一致性。但是&#xff0c;很多時候往往事與愿違。 尤其是現在很多公司都采用最終一致性的方案&#xff0c;而所謂最終一致性&#xff0c;無論是本地消息表、事務消息、還…

藍橋杯:數組分割(Java)

目錄 問題描述輸入格式輸出格式代碼實現 問題描述 小藍有一個長度為N的數組A[A0,A1,… AN-1]。現在小藍想要從A對應的數組下標所構成的集合Ⅰ0,1,2,…,N -1中找出一個子集R1&#xff0c;那么R1在Ⅰ中的補集為R2。記S1∈∑Ar&#xff0c;S2∈∑Ar&#xff0c;我們要求S1和S2均為…

node 之 npm

1.什么是包 node.js中的第三方模塊又叫做包 就像電腦和計算機指的是相同的東西&#xff0c;第三方模塊和包指的是同一個概念&#xff0c;只不過叫法不同 2.包的來源 不同于 Node.js 中的內置模塊與自定義模塊&#xff0c;包是由第三方個人或團隊開發出來的&#xff0c;免費供所…

【計算機網絡——應用層】http協議

文章目錄 1. http協議1.1 http協議簡介1.2 url組成1.3 urlencode與urldecode 2. http協議的格式2.1 http協議的格式2.2 一些細節問題 3. http的方法、狀態碼和常見響應報頭3.1 http請求方法3.2 http狀態碼3.3 http常見的響應報頭屬性 4. 一個非常簡單的http協議服務端5. http長…

【X806開發板試用】文章一 ubuntu開發環境搭建

一、環境配置 官方鏈接&#xff1a; 環境配置 1.安裝必要的庫和軟件 sudo apt-get install build-essential gcc g make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-b…

pix2pix-zero

pix2pix-zero&#xff1a;零樣本圖像到圖像轉換 論文介紹 Zero-shot Image-to-Image Translation 關注微信公眾號: DeepGoAI 項目地址&#xff1a;https://github.com/pix2pixzero/pix2pix-zero 論文地址&#xff1a;https://arxiv.org/abs/2302.03027 本文介紹了一種名為…

Golang 函數中 defer 和 return 的調用順序

先來看一段代碼&#xff1a; package mainimport "fmt"func f() (ret int) {defer func() {ret}()return 1 } func main() {fmt.Println(f()) }上面這段代碼的輸出是2&#xff0c;不是1 原因在于&#xff1a; 1&#xff09;ret 是在執行 return 1 語句后發生的 2&…

基于SpringBoot多模塊項目引入其他模塊時@Autowired無法注入

基于SpringBoot多模塊項目引入其他模塊時Autowired無法注入 一、問題描述1、解決方案 一、問題描述 啟動Spring Boot項目時報 Could not autowire. No beans of ‘xxxxxxxx’ type found. 沒有找到bean的實例&#xff0c;即spring沒有實例化對象&#xff0c;也就無法根據配置文…

【LeetCode-中等】209.長度最小的子數組-雙指針/滑動窗口

力扣題目鏈接 1. 暴力解法 這道題的暴力解法是兩層嵌套for循環&#xff0c;第一層循環從 i 0 開始遍歷至數組末尾&#xff0c;第二層循環從 j i 開始遍歷至找到總和大于等于 target 的連續子數組&#xff0c;并將該連續子數組的長度與之前找到的子數組長度相比較&#xff0…

傳輸層兩大戰將TCP、UDP的定位

傳輸層 定義一些傳輸數據的協議和端口&#xff0c;傳輸協議同時進行流量控制&#xff0c;根據接收方的數據吞入熟讀&#xff0c;規定適當的發送速率&#xff0c;解決傳輸效率及能力問題 什么是TCP TCP/IP即傳輸控制/網絡協議&#xff0c;是面向連接的協議&#xff0c;發送數…

什么是IP公網?

IP公網是指互聯網上可以公開訪問的IP地址。它是經過互聯網服務提供商&#xff08;ISP&#xff09;向用戶提供的公共網絡IP地址。與之相對的是內網IP地址&#xff0c;內網IP地址一般是由路由器或交換機分配給連接在局域網中的設備使用。 IP公網的作用非常廣泛&#xff0c;可以應…