主頁 > 後端開發 > Java集合——List,Set,Map總結筆記

Java集合——List,Set,Map總結筆記

2021-10-13 06:19:19 後端開發

1. 集合 Collection

1.1 Java 集合框架

? ? ? ? ? ? ? ? Java 集合框架位于 java.util 包中,Java 集合框架主要包括兩種型別的容器,一種是集合(Collection),存盤一個元素集合,另一種是圖(Map),存盤鍵/值對映射,Collection 介面又有 3 種子型別,List、Set 和 Queue,再下面是一些抽象類,最后是具體實作類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等,

? ? ? ? ? ? ? ? 集合框架是一個用來代表和操縱集合的統一架構,所有的集合框架都包含如下內容:

  • 介面:Collection,List,Set,Map 等,用于以不同的方式操作集合物件
  • 實作類:是集合介面的具體實作,如 ArrayList、LinkedList、HashSet、HashMap
  • 演算法:是實作集合介面的物件里的方法執行的一些有用的計算,如搜索和排序,這些演算法被稱為多型,那是因為相同的方法可以在相似的介面上有著不同的實作
    ? ? ? ? ? ? ? ?

集合和陣列的區別:

  • 集合長度可變,陣列長度固定
  • 集合中只能是參考型別,陣列中既可以是基本型別也可以是參考型別
  • 集合中可以存盤不同型別的元素(通常只存放同種型別),陣列只能存盤同一種型別
    ? ? ? ? ? ? ? ?

1.2 集合介面

介面 描述
Collection 最基本的介面,一個 Collection 代表一組物件,Java 不提供直接繼承自 Collection 的類,只提供其子介面,Collection 介面存盤一組不唯一,無序的物件,
List List 介面是一個有序的 Collection,可以精確的控制每個元素的插入位置,通過索引訪問元素,允許有相同的元素,List 介面存盤一組不唯一,有序的物件,
Set 具有與 Collection 完全一樣的介面,但不保存重復元素,Set 介面存盤一組唯一,無序的物件,
SortedSet 繼承于 Set,保存有序的集合,
Map 存盤一組鍵值物件,提供 key 到 value 的映射
SortedMap 繼承與 Map,使 key 保持升序排列

? ? ? ? ? ? ? ?

1.3 Collection 集合的方法

方法 描述
boolean add(E e) 在集合末尾添加元素
boolean remove(E e) 洗掉值與 e 相等的元素,回傳 true,若不存在,回傳 false
void clear() 清除本類集中所有元素
boolean contains(E e) 判斷集合中是否包含 e
boolean isEmpty() 判斷集合是否為空
int size() 回傳集合中的元素個數
boolean addAll(Collection c) 將一個類集 c 中所有元素添加到另一個類集
Object[] toArray() 回傳一個包含本類集中所有元素的陣列,陣列型別為 Object[]
Iterator iterator() 迭代器,集合專用的遍歷方式

? ? ? ? ? ? ? ?

2. List

? ? ? ? ? ? ? ? List 介面是一個有序的 Collection,可以精確的控制每個元素的插入位置,通過索引訪問元素,可以存盤相同元素,List 介面存盤一組不唯一,有序的物件,

? ? ? ? ? ? ? ? List 共有三個實作類,ArrayList,Vector,LinkedList,

2.1 ArrayList

? ? ? ? ? ? ? ? ArrayList 是最常用的 List 實作類,內部通過陣列實作,允許堆元素進行快速隨機訪問,

? ? ? ? ? ? ? ? 由于陣列存盤需要整塊記憶體空間,中間不能有間隔,當陣列大小不足需要擴張時,需要將已有陣列的資料全部復制到新存盤空間中,當從 ArrayList 中間插入或洗掉元素時,需要對陣列進行復制、移動,代價很高,因此只適合查找遍歷,不適用于頻繁的插入洗掉,

特點:

  • 底層資料結構為陣列
  • 查詢快,增刪慢
  • 執行緒不安全,效率高
  • 可以存盤重復元素

? ? ? ? ? ? ? ?

2.1.1 常用方法

方法 描述
boolean remove(E e) 洗掉指定元素,回傳是否洗掉成功
E remove(int index) 洗掉指定索引處元素,回傳被洗掉元素
E set(int index, E e) 修改指定索引處元素,回傳被修改的元素
E get(int index) 回傳指定索引處的元素
int size() 回傳元素個數
boolean add(E e) 將指定元素追加到集合末尾
void add(int index, E e) 在集合中指定位置插入元素

? ? ? ? ? ? ? ?

2.2 LinkedList

? ? ? ? ? ? ? ? LinkedList 是一個繼承于 AbstractSequentialList 的雙向鏈表,同時也可以被當做堆疊、佇列或雙端佇列操作,

? ? ? ? ? ? ? ? LinkedList 實作了 List 介面,能對它進行佇列操作,

? ? ? ? ? ? ? ? LinkedList 實作了 Deque 介面,即能將LinkedList當作雙端佇列使用,
? ? ? ? ? ? ? ? LinkedList 實作了 Cloneable 介面,即覆寫了函式clone(),能克隆,
? ? ? ? ? ? ? ? LinkedList 實作 java.io.Serializable 介面,這意味著 LinkedList 支持序列化,能通過序列化去傳輸,

? ? ? ? ? ? ? ? LinkedList 包含兩個重要成員 header 和 size, header 是雙向鏈表的表頭,是雙向鏈表節點對應的類 Entry 的實體,Entry 中包含成員變數:previous,next,element,element 是該節點中存放的資料,

特點:

  • 底層資料結構是雙向鏈表

  • 查詢慢,增刪快

  • 執行緒不安全,效率高

  • 可以存盤重復元素

? ? ? ? ? ? ? ?

2.2.1 常用方法

方法 描述
boolean add(E e) 在鏈表末尾添加新節點
void add(int index, E e) 在鏈表指定位置添加新節點
void addFirst/push(E e) 在鏈表表頭添加新節點
void addLast/offer(E e) 在鏈表表尾添加新節點
E removeFirst/pop() 洗掉第一個節點,并回傳該物件
E removeLast() 洗掉最后一個節點,并回傳該物件
E remove(int index) 洗掉指定位置節點
E get(int index) 得到指定位置節點
int indexOf(E e) 回傳物件在鏈表中首次出現的位置,如沒有回傳 -1
int lastIndexOf(E e) 回傳物件在鏈表中最后一次出現的位置,如沒有回傳 -1

? ? ? ? ? ? ? ?

2.3 Vector

? ? ? ? ? ? ? ? 與 ArrayList 基本相同,通過陣列實作,最大的區別是支持執行緒同步,某一時刻只有一個執行緒能夠修改 Vector,但執行緒同步需要很高的消費,訪問比 ArrayList 慢,

特點:

  • 底層資料結構是陣列
  • 查詢快,增刪慢
  • 執行緒安全,效率低
  • 可以存盤重復元素
  • 使用 synchronized 方法保證執行緒安全
    ? ? ? ? ? ? ? ?

3. Set

? ? ? ? ? ? ? ? Set 具有與 Collection 完全一樣的介面,Set 中的物件不可重復,除此之外可以把 Set 當做 Collection 使用,該集合用于存盤無序元素,物件是否重復根據 hashCode 判斷,
? ? ? ? ? ? ? ? 如果想讓兩個不同的物件被視為相等,就必須覆寫 Object 的 hashCode 方法和 equals 方法,

? ? ? ? ? ? ? ?

3.1 HashSet

? ? ? ? ? ? ? ? HashSet 底層資料結構采用哈希表實作,元素的唯一性通過該元素型別是否重寫 hashCode() 和 equals() 方法來保證

? ? ? ? ? ? ? ? HashSet 首先判斷兩個元素的哈希值,如果哈希值相同,會接著通過 equals 方法比較,如果 equals 也為 true,則視為同一個元素,

? ? ? ? ? ? ? ? HashSet 通過 hashCode 的值來確定元素在記憶體中的位置,一個 hashCode 位置上可以存放多個元素(多個元素存放在一個哈希桶中),

特點:

  • 底層資料結構為哈希表
  • 元素無序且唯一
  • 執行緒不安全
  • 效率高
  • 可存盤 null 元素

? ? ? ? ? ? ? ?

3.2 LinkedHashSet

? ? ? ? ? ? ? ? LinkedHashSet 繼承于 HashSet,底層使用 LinkedHashMap 保存所有元素,方法操作上與 HashSet 相同,

特點:

  • 底層使用 LinkedHashMap 保存元素
  • 元素順序與存盤順序一致
  • 元素唯一
  • 執行緒不安全,效率高

? ? ? ? ? ? ? ?

3.3 TreeSet

? ? ? ? ? ? ? ? TreeSet 的底層資料結構為紅黑樹,實作了 SortedSet 介面,可以隨時確保集合中的元素處于有序狀態,

? ? ? ? ? ? ? ? TreeSet 每插入一個物件都會進行排序,將其插入紅黑樹的指定位置,Integer 和 String 物件都可以進行默認的 TreeSet 排序,但自定義物件不可以,自定義類必須實作 Comparable 介面,并重寫 compareTo() 方法才能使用 TreeSet

? ? ? ? ? ? ? ? 重寫 compareTo() 方法時,比較不同的值,需要根據小于、等于、大于來回傳相應的負整數,零或正整數,

特點:

  • 底層資料結構為紅黑樹
  • 元素有序且唯一
  • 只能添加同種型別物件
  • 不支持快速隨機訪問
  • 不允許元素為 null

? ? ? ? ? ? ? ?

3.3.1 常用方法

方法 描述
E higher(E e) 回傳集合中大于等于給定元素的最小元素
E lower(E e) 回傳嚴格小于給定元素的最大元素
E higher(E e) 回傳嚴格大于給定元素的最小元素
SortedSet headSet(E e) 回傳此 Set 中所有小于 e 的子集
SortedSet tailSet(E e) 回傳此 Set 中所有大于 e 的子集

4. Map

? ? ? ? ? ? ? ? List 和 Set 都繼承自 Collection 介面,Map 不是,Map 用于保存具有映射關系的資料 key 和 value,通過鍵 key 查找值 value,它們可以是任何參考型別的資料,但 key 不能重復,

? ? ? ? ? ? ? ?

4.1 Map 的主要方法

方法 描述
void clear() 洗掉全部映射
boolean containsKey(E key) 查詢 Map 中是否包含指定 key
boolean containsValue(E value) 查詢 Map 中是否包含指定 value
boolean isEmpty() 查詢 Map 是否為空
E get(E key) 回傳指定 key 對應的 value
E put(E key, E value) 添加一對映射,如果有相同的 key 覆寫 value
void putAll(Map m) 將指定 Map 中映射復制到 Map 中
E remove(E key) 洗掉指定 key 對應的映射,回傳關聯的 value
int size() 回傳 Map 中的映射對數
Set entrySet() 回傳 Map 中所包含映射組成的 Set 集合,每個集合元素都是 Map.Entry 物件
Set keySet() 回傳 Map 中所有 key 組成的 Set 集合
Collection values() 回傳 Map 中所有 value 組成的 Colllection

? ? ? ? ? ? ? ?

4.2 HashMap

? ? ? ? ? ? ? ? HashMap 的主干是一個 Entry 陣列,Entry 是 HashMap 的基本組成單元,每一個 Entry 包含一個 key-value 鍵值對,為了解決哈希沖突 HashMap 采用了鏈地址法,也就是陣列+鏈表的方式,
? ? ? ? ? ? ? ? 因此大多數情況下 HashMap 可以直接定位到值,訪問速度極快,遍歷順序不確定,HashMap 只允許一個鍵為 null,允許多條值為 null,且 HashMap 非執行緒安全,
? ? ? ? ? ? ? ? JDK 8 對 HashMap 進行了修改,最大的不同是引入了紅黑樹提升 HashMap 的查找效率,在 JDK 8 中,為解決哈希沖突的鏈表中的元素超過 8 個以后,會將鏈表轉換為紅黑樹,在此處查找是可以把時間復雜度降低至 O(logN),

? ? ? ? ? ? ? ?

HashMap的建構式

public HashMap(int initialCapacity, float loadFactor) {
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
    if (initialCapacity > MAXIMUM_CAPACITY)
        initialCapacity = MAXIMUM_CAPACITY;
    if (loadFactor <= 0 || Float.isNaN(loadFactor))
        throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
    this.loadFactor = loadFactor;
    this.threshold = tableSizeFor(initialCapacity);
}

? initialCapacity 為 HashMap 的初始大小,loadFactor 為負載因子,

? 如果不填入構造引數,默認初始大小為16,負載因子為0.75,

特點:

  • 底層資料結構:陣列代表一對映射,鏈表/紅黑樹解決哈希沖突
  • 訪問速度快,效率極高
  • 遍歷順序不確定
  • 非執行緒安全

? ? ? ? ? ? ? ?

4.3 LinkedHashMap

? ? ? ? ? ? ? ? LinkedHashMap 是 HashMap 的一個子類,底層資料結構是用雙向鏈表連接起來的 HashMap,可以保留插入順序,其存取程序基本與 HashMap 相同,
? ? ? ? ? ? ? ? LinkedHashMap 通過維護一個額外的雙向鏈表保證了迭代順序,該迭代順序可以是插入順序,也可以是訪問順序,因此,根據鏈表中元素的順序可以將其分為:保持插入順序的 LinkedHashMap保持訪問順序的 LinkedHashMap,其中 LinkedHashMap 的默認按插入順序排序,
? ? ? ? ? ? ? ? 因此 LinkedHashMap 可以很好的支持 LRU 演算法,

特點:

  • 底層資料結構:雙向鏈表連接 HashMap 中的 Entry 陣列
  • 可按插入順序或訪問順序存盤
  • 可以很好的支持 LRU 演算法
  • 非執行緒安全

? ? ? ? ? ? ? ?

4.4 ConcurrentHashMap

? ? ? ? ? ? ? ? ConcurrentHashMap 支持并發操作,是安全高效的 Map 集合,廣泛應用于多執行緒開發,并發控制使? synchronized 和 CAS 來操作,synchronized 只鎖定當前鏈表或紅??叉樹的首節點,這樣只要 hash 不沖突,就不會產?并發,效率極大的提升,
? ? ? ? ? ? ? ? JDK 8 后 ConcurrentHashMap 的資料結構改為 Node 陣列+鏈表/紅黑樹的結構,
? ? ? ? ? ? ? ? 紅黑樹結構略有不同,HashMap 的紅黑樹中的節點叫做 TreeNode,TreeNode 不僅僅有屬性,還維護著紅黑樹的結構,比如說查找,新增等等,ConcurrentHashMap 中紅黑樹被拆分成兩塊,TreeNode 僅僅維護的屬性和查找功能,新增了 TreeBin,來維護紅黑樹結構,并負責根節點的加鎖和解鎖,

  • Node:Node 物件是鏈表上的一個節點,內部存盤 key、value,以及下一個節點的參考,節點中的 value 和 next 都用 volatile 修飾,保證并發的可見性

  • ForwardingNode:當擴容時,要把鏈表遷移到新的哈希表,在做這個操作時,會在把陣列中的頭節點替換為 ForwardingNode 物件,ForwardingNode 中不保存 key 和 value,只保存擴容后哈希表(nextTable)的參考,此時查找相應 node 時,需要去 nextTable 中查找

  • TreeBin:當鏈表轉為紅黑樹后,陣列中保存的參考為 TreeBin,TreeBin 內部不保存 key 或 value,它保存了 TreeNode 的 list 以及紅黑樹 root

    ? ? ? ? ? ? ? ?

ConcurrentHashMap 中添加映射的程序(put 方法)

public V put(K key, V value) {
        return putVal(key, value, false);
    }

final V putVal(K key, V value, boolean onlyIfAbsent) {
    if (key == null || value =https://www.cnblogs.com/wu-Chiyu/archive/2021/10/12/= null) throw new NullPointerException();
    int hash = spread(key.hashCode());
    int binCount = 0;
    for (Node[] tab = table;;) {
        Node f; int n, i, fh;
        if (tab == null || (n = tab.length) == 0)
            tab = initTable();
        else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
            if (casTabAt(tab, i, null,
                         new Node(hash, key, value, null)))
                break;                   // no lock when adding to empty bin
        }
        else if ((fh = f.hash) == MOVED)
            tab = helpTransfer(tab, f);
        else {
            V oldVal = null;
            synchronized (f) {
                if (tabAt(tab, i) == f) {
                    if (fh >= 0) {
                        binCount = 1;
                        for (Node e = f;; ++binCount) {
                            K ek;
                            if (e.hash == hash &&
                                ((ek = e.key) == key ||
                                 (ek != null && key.equals(ek)))) {
                                oldVal = e.val;
                                if (!onlyIfAbsent)
                                    e.val = value;
                                break;
                            }
                            Node pred = e;
                            if ((e = e.next) == null) {
                                pred.next = new Node(hash, key, value, null);
                                break;
                            }
                        }
                    }
                    else if (f instanceof TreeBin) {
                        Node p;
                        binCount = 2;
                        if ((p = ((TreeBin)f).putTreeVal(hash, key, value)) != null) {
                            oldVal = p.val;
                            if (!onlyIfAbsent)
                                p.val = value;
                        }
                    }
                }
            }
            if (binCount != 0) {
                if (binCount >= TREEIFY_THRESHOLD)
                    treeifyBin(tab, i);
                if (oldVal != null)
                    return oldVal;
                break;
            }
        }
    }
    addCount(1L, binCount);
    return null;
}

具體流程:

  • 給輸入的 key 分配 hashcode,分配好后依次判斷
  • 判斷是否需要初始化
  • 判斷 key 對應的 Node 陣列是否為空,如果為空則用 CAS 寫入資料
  • 判斷是否需要擴容
  • 如果都不滿足,則利用 synchronized 鎖寫入資料
  • 如果鏈表長度大于 TREEIFY_THRESHOLD,則將鏈表改為紅黑樹
    ? ? ? ? ? ? ? ?

特點:

  • 底層資料結構:Node陣列+鏈表/紅黑樹
  • 執行緒安全高效,多執行緒使用
  • 并發控制使用 synchronized 和 CAS,synchronized 只鎖定當前鏈表或紅??叉樹的首節點

? ? ? ? ? ? ? ?

4.5 HashTable

? ? ? ? ? ? ? ? 執行緒安全的 HashMap,同一時間只有一個執行緒能夠修改 HashTable,并發性遠遠不如 ConcurrentHashMap,效率低下,不建議在代碼中使用,

4.6 TreeMap

? ? ? ? ? ? ? ? TreeMap 實作了 SortedMap 介面,能夠把保存的記錄根據鍵排序,默認為鍵值升序,也可以指定排序的比較器,如果使用排序的映射,建議使用 TreeMap,
? ? ? ? ? ? ? ? TreeMap 底層為紅黑樹,將代表一對對映射的 Entry 陣列作為節點連接成紅黑樹,不需要調優,紅黑樹自動平衡,
? ? ? ? ? ? ? ? 在使用 TreeMap 來保存自定義物件時,與 TreeSet 相同必須讓自定義物件的類實作 Comparable 介面,并重寫 compareTo() 方法,

?

特點:

  • 底層資料結構為紅黑樹
  • 存入映射按鍵值排序,默認升序
  • 非執行緒安全
    ? ? ? ? ? ? ? ?

4.6.1 常用方法

方法 描述
Map.Entry firstEntry() 回傳最小 key 對應鍵值對
Map.Entry lastEntry() 回傳最大 key 所對應的鍵值對
E firstKey() 回傳最小 key
E lastKey() 回傳最大 key
Map.Entry higherEntry(E key) 回傳位于 key 后一位的鍵值對
Map.Entry lowerEntry(E key) 回傳位于 key 前一位的鍵值對
E lowerKey(E key) 回傳位于 key 前一位的 key
E higherKey(E key) 回傳位于 key 后一位的 key

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310359.html

標籤:其他

上一篇:學習Tomcat(七)之Spring內嵌Tomcat

下一篇:Python的串列和元組

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more