System.Collections.Generic 源碼閱讀總結

来源:https://www.cnblogs.com/millionsmultiplication/archive/2018/08/03/9416325.html
-Advertisement-
Play Games

ArrayList ,List ArrayList 和 List 都是不限制長度的集合類型 ,List相比ArrayList 就內部實現而言除了泛型本質沒有太大區別。不過為避免裝箱拆箱問題,儘可能使用List 集合內部是由數組實現,預設大小是4,但你使用無參構造函數構造實例時,內部數組大小是0,當你 ...


ArrayList ,List

ArrayList 和 List 都是不限制長度的集合類型 ,List相比ArrayList 就內部實現而言除了泛型本質沒有太大區別。不過為避免裝箱拆箱問題,儘可能使用List

集合內部是由數組實現,預設大小是4,但你使用無參構造函數構造實例時,內部數組大小是0,當你加入第一個元素時,才擴容為4,添加元素時,如果發現內置數組大小不夠,內置數組大小會擴容為原來的兩倍,每一次擴容都會重新開闢一個數組,拷貝舊數組的數據,如果你要給集合添加大量的元素卻不為它初始化一個合適容量,頻繁的記憶體開闢和多餘的數組拷貝會導致性能的損耗。

所以使用時建議提供合適的容量。

hashtable,Dictionary

hashtable和Dictionary都是哈希表的實現,很多人說Dictionary內部是由hashtable實現的,這是不恰當的。

hashtable的構造需要裝載因數,裝載因數是0.1 到 1.0 範圍內的數字 ,是內部存儲桶數(count)所占桶數組(buckets)桶數(hashsize)的最大比率 ,當桶數大於裝載數(loadsize)時,桶數組就會擴容

hashtable內部解除哈希衝突的演算法是雙重散列法,是開放地址法中最好的方法之一

而不同的是,Dictionary內部解除哈希衝突的演算法是鏈地址法,而且Dictionary的構造不需要裝載因數,不受裝載因數的限制 ,如果Dictionary非常小,查找,插入,刪除等操作擁有近乎O(1)的效率

和ArrayList ,List類似的是Dictionary和hashtable內部也是由數組實現的,所以構造時也需要提供合適容量,防止性能的損耗。

但我們需要另外註意的是你提供給構造函數的容量不一定會是初始時內置數組的長度,構造函數內部會選擇一個大於等於你所選擇容量的素數作為真實的初始容量。

HashSet

HashSet是一個無序的能夠保持唯一性的集合。我們也可以把HashSet看作是Dictionary<TKey,TValue>,只不過TKey和TValue都指向同一個對象。內部實現和Dictionary非常相似。 HashSet非常適合在我們需要保持集合內元素唯一性但又不需要按順序排列的時候。

SortedList

SortedList是支持排序的關聯性(鍵值對 )集合 ,內部採用數組實現,所以和List相同的是,初始化時需要提供一個合適的容量,SortedList內部採用哈希演算法實現,和Dictionary類似的是,SortedList內部解除哈希衝突的演算法是鏈地址法。

因為在查找的時候利用了二分搜索,所以查找的性能會好一些,時間複雜度是O(log n)

如果你想要快速查找,又想集合按照key的順序排列,最後這個集合的操作(添加和移除)比較少的話,就是SortedList了

SortedSet,SortedDictioanry

SortedSet類似於HashSet,但略有不同的是,SortedSet是有序排列,SortedSet內部實現應該是所有集合中最複雜,是依靠紅黑樹的原理實現。

SortedDictioanry和Dictionary的區別與HashSet和SortedSet的區別基本一致,因為SortedDictioanry內部本身就是依靠SortedSet實現的,並且SortDictionary內部順序是以key的順序為排列的

public SortedDictionary(IDictionary<TKey,TValue> dictionary, IComparer<TKey> comparer) {
          if( dictionary == null) {
              ThrowHelper.ThrowArgumentNullException(ExceptionArgument.dictionary);
          }
 
          _set = new TreeSet<KeyValuePair<TKey, TValue>>(new KeyValuePairComparer(comparer));
 
          foreach(KeyValuePair<TKey, TValue> pair in dictionary) {
              _set.Add(pair);
          }            
      }

LinkedList,Stack,Queue

這3個集合我就不多做解釋,完全按這幾個基礎數據結構的原理來實現。不過Stack,Queue內部採用數組實現,所以也要註意初始化時提供一個恰當的容量啊


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 異常在Java中有兩種分類:Error(OutOfMemoryError之類的我們自己程式無法處理的非常嚴重的錯誤,Java推薦不catch,讓程式隨之崩潰)、Excepiton(NullPointerException之類的並不致命的錯誤,Java覺得indicates conditions th ...
  • StringBuilder用法 StringBuilder str=new StringBuilder(); 和String用法的區別是 string 對象時恆定不變的,stringBuider對象表示的字元串是可變的。 StringBuilder 類提供了很多方法來操作字元串: 包裝類 基本數據類 ...
  • Spring5源碼解析-Spring框架中的單例和原型bean 最近一直有問我單例和原型bean的一些原理性問題,這裡就開一篇來說說的 通過Spring中的依賴註入極大方便了我們的開發。在xml通過<bean>定義(或者通過@Bean在配置類里定義)對象之後,然後只需簡單地使用@Autowired註 ...
  • python中有兩種數據類型:一種是可變數據類型,一種是不可變數據類型 不可變數據類型包括(整型及其他數據類型,字元串及元組) 可變數據類型(列表,集合,字典,類和類實例) 鑒定是否為拷貝還是只是引用計數加1,我們可以用python的內置函數(id())來驗證. 程式運行結果表明s和s1的記憶體地址是 ...
  • 1. Apache Kafka是一個分散式流平臺 1.1 流平臺有三個關鍵功能: 1.2 Kafka通常用於兩大類應用: 1.3 有幾個特別重要的概念: Kafka is run as a cluster on one or more servers that can span multiple d ...
  • 一:定義 對於代碼塊和功能的封裝和定義 二:函數的定義, 函數名, 函數體以及函數的調用 我們使用def關鍵字來定義函數, 函數的定義語法: 函數名的命名規則和變數基本一致, 函數體就是函數被執行之後要執行的代碼 函數名()的形式用來調用函數. 三:函數的返回 return關鍵字會中斷函數,並返回一 ...
  •  Net Core平臺靈活簡單的日誌記錄框架NLog初體驗 前幾天分享的"[Net Core集成Exceptionless分散式日誌功能以及全局異常過濾][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人說比較重量,生產環境部署也比較麻煩。因此 ...
  • [TOC] 1.1 簡介 本章介紹在C 中實現線程同步的幾種方法。因為多個線程同時訪問共用數據時,可能會造成共用數據的損壞,從而導致與預期的結果不相符。為瞭解決這個問題,所以需要用到線程同步,也被俗稱為“加鎖”。但是 加鎖絕對不對提高性能,最多也就是不增不減 ,要實現性能不增不減還得靠高質量的 同步 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...