C#常用的資料結構
一、常用資料結構
Array,ArrayList,List,LinkedList,Queue,Stack,Dictionary<K,T>
二、常用資料結構總結
陣列(Array):
1、陣列儲存在連續的記憶體上
2、陣列的元素型別必須相同
3、陣列可以直接通過下標訪問
4、查詢與修改元素的速度非常快
5、必須在宣告時指定長度
缺點:
1、在連續儲存在兩個元素之間插入新的元素不方便。
2、宣告一個新的陣列時,必須指定其長度,這就會存在一個潛在的問題,那就是當我們宣告的長度過長時,顯然會浪費記憶體,當我們宣告長度過短的時候,則面臨這溢位的風險。
為了解決陣列Array建立時必須指定長度以及只能存放相同型別的缺點而推出的資料結構ArrayList
動態陣列(ArrayList):
1、ArrayList的底層其實就是一個數組
2、不必在宣告時指定長度,會根據儲存的資料動態增加或減少長度
3、插入和刪除一個元素時,會移動它之後所有元素的位置,效率低,頻繁進行插入刪除元素時推薦使用LinkedList
4、ArrayList會把所有元素都當做Object處理,因此可以儲存不同型別的元素
缺點:
ArrayList是非型別安全的,而且在插入和刪除元素時會進行拆箱和裝箱的操作,消耗效能,效率低
為了解決ArrayList不安全型別與裝箱拆箱才有了泛型,List的內部其實也是一個Array。List是型別安全。沒有裝箱和拆箱的操作。融合Array可以快速訪問的優點以及ArrayList長度可以靈活變化的優點。所屬名稱空間:System.Collections.Generic
泛型List:
1、List是ArrayList的泛型等效類
2、需要在宣告時通過泛型指定型別
3、沒有拆箱裝箱操作,因此在大多數情況下List要比ArrayList效率高且型別安全
雙向連結串列(LinkedList):(連結串列適合元素數量不固定,需要兩端存取且經常增減節點的情況)
雙向連結串列(LinkedList)和上述的陣列最大的不同之處就是在於連結串列在記憶體儲存的排序上可能是不連續的。這是由於連結串列是通過上一個元素指向下一個元素來排列的,所以可能不能通過下標來訪問。
優點:
1、向連結串列中插入或刪除節點無需調整結構的容量。因為本身不是連續儲存而是靠各物件的指標所決定,所以新增元素和刪除元素都要比陣列要有優勢。
連結串列適合在需要有序的排序的情境下增加新的元素,這裡還拿陣列做對比,例如要在陣列中間某個位置增加新的元素,則可能需要移動移動很多元素,而對於連結串列而言可能只是若干元素的指向發生變化而已。
缺點:由於其在記憶體空間中不一定是連續排列,所以訪問時候無法利用下標,而是必須從頭結點開始,逐次遍歷下一個節點直到尋找到目標。所以當需要快速訪問物件時,陣列無疑更有優勢。
堆疊(Stack):
先進後出原則,最先插入的元素最後被訪問,最後被插入的元素最先被訪問
佇列(Queue):
先進先出的原則,最先插入的元素最先被訪問,最後插入的元素最後被訪問
字典(Dictionary):
1、建立字典時需要指定key和value的型別
2、字典中的key的值必須唯一,value的值不唯一
3、可以通過key快速查詢對應的value,速度快,但是消耗記憶體