C 集合介面與集合類

2021-07-11 17:49:58 字數 1712 閱讀 4569

c#開發經常用到.net框架為我們提供的集合介面和集合類,接下來做乙個總結,如有差錯,希望各位大神指正。

首先是集合介面,自己畫了一張圖(嘿嘿,有點醜),來說明集合介面的繼承關係。

個人覺得,了解集合介面,首先要把握他們的繼承關係。如上圖,所有的集合介面和集合類都繼承/實現ienumerable介面。ienumerable只有乙個方法getenumerator。簽名如下:

ienumerator getenumerator()

這個方法返回值型別為ienumerator,正是ienumerator 介面定義了集合遍歷的基本方法,使得我們可以通過遍歷來訪問集合中的元素。

public inte***ce ienumerator

void reset();

}movenext方法是將游標移動到下乙個位置,current 屬性表示當前項,reset方法是將游標重置到第乙個項的位置。

其他的各個介面都提供了各種方法,這些都可以直接在開發工具上檢視,暫時略過。接下來說說集合類。

集合類是在實現集合介面的基礎上,做進一步的擴充套件。分為非泛型集合類、泛型集合類、執行緒安全集合類。

非泛型集合類:

1:arraylist,arraylist是可變長度的陣列,它的出現就是為了彌補陣列的長度是固定的這個缺陷。但他也帶來了另乙個問題,arraylist可以儲存任意型別的資料,所以它也存在裝箱拆箱所帶來的效能問題。所以,後來.net2.0以後,就用list取代arraylist 

2:hashtable 鍵值對訪問,key不能重複。通過key來查詢value時,速度非常快,但是訪問時也存在裝箱拆箱操作。所以後來就被dictionary所取代。

3:stack 先進後出,個人一直覺得 棧是乙個非常偉大的發明。

4:queue 先進先出。

泛型集合類:

1:list可變長度,並且是有序的。所以如果在其尾部增加或刪除資料,那速度比較快。如果在其頭部或中間增加或刪除資料,那速度比較慢,因為還要重新排序。

2:linkedlist它是乙個雙向鍊錶,這也是為了彌補list的缺陷而出現的。不管在什麼位置刪除資料,速度都很快。

3:hashset它是無序的,不允許通過下標訪問。當對兩個集合進行差集、並集運算的時候,它的效能非常好。

4:sortedset它是有序的,與hashset對應。它可以通過key來索引,也可以通過下標來索引。但是他的效能比hashtable差。

5:stack先進後出

6:queue先進先出

7:dictionary它是對hashtable的優化,不必進行裝箱拆箱操作。多執行緒情況下推薦使用hashtable,因為dictionary是非執行緒安全的,在多執行緒情況下,要進行lock鎖定,這時效率就比較差了。

執行緒安全集合類   一般情況下,非執行緒安全的集合類,可以通過加上lock來鎖定。.net提供了執行緒安全集合類

1:concurrentdictionary  執行緒安全的dictionary

2:concurrentqueue    執行緒安全版本的queue

3:concurrentstack    執行緒安全版本的stack

以上是個人對c#集合介面和集合類的總結,部分介面和類可能沒有接觸到。如有遺漏,歡迎交流補充。

c 中常用集合類和集合介面之集合類系列

常用集合類 陣列 array 的不足 即 集合與陣列的區別 1.陣列是固定大小的,不能伸縮。雖然system.array.resize這個泛型方法可以重置陣列大小,但是該方法是重新建立新設定大小的陣列,用的是舊陣列的元素初始化。隨後以前的陣列就廢棄!而集合卻是可變長的。2.陣列要宣告元素的型別,集合...

c 中常用集合類和集合介面之集合類系列

常用集合類 陣列 array 的不足 即 集合與陣列的區別 1.陣列是固定大小的,不能伸縮。雖然system.array.resize這個泛型方法可以重置陣列大小,但是該方法是重新建立新設定大小的陣列,用的是舊陣列的元素初始化。隨後以前的陣列就廢棄!而集合卻是可變長的。2.陣列要宣告元素的型別,集合...

集合類 Collection介面

常用集合 list集合,set集合,map集合,其中list集合,set集合繼承了collection介面 集合類又被稱為容器,裡面的長度是可變的 collection介面通常不直接使用 collection介面常用方法 方法描述 add e e 將指定物件新增到該集合中 remove 將指定物件從...