Unity(二) c#常用數據結構解析回顧

最近做完項目後,對基礎的常用數據結構進行一下回顧,往下挖掘一下。

一、數組

   
之所以把數組單獨提出來想,是想把他們進行比較,畢竟數組的時間關係也涉及到了他的優化改進。
數組當仁不讓是最基礎的結構了。C#裏按時間線是Array——ArrayList——List。但ArrayList應該是裏面使用率最低的了,原因往下說。
 

1)Array

1)Array在內存上的存儲是連續的。
2)Array中的元素必須是同類型的。
3)Array直接通過下標訪問(後面會和鏈表比較)。
 
優點:
1)賦值與修改元素方便。
2)查找速度快。
 
缺點:
1)插入和從中間刪除不方便,需要自己控制數組大量的移動元素進行操作。
2)初始化時需要定義長度,定義太大會資源浪費,定義太小會產生溢出
 
這是最基礎的數組,在數據量不大的時候使用起來非常方便,速度快效率高。
 

2)ArrayList

爲了解決Array中的缺點暴露出來的問題,ArrayList可以說是使用起來非常完美,添加,刪除,插入,賦值,查找都非常方便。
優點:初始化時不用聲明長度,會根據存儲動態的改變長度。
 
缺點:可以存儲不同的類型。
這個缺點看起來非常像優點,但是這是對於用戶而言的優點,對於程序猿來說,情況就不一樣了。這得從ArrayList的實現上來看:
1)這不是類型安全的:
  ArrayList的默認類型是Object,如果說存儲的是int類型,那在ArrayList中就會把他轉化爲Object類型,當使用的時候還需要再轉回int類型。如果使用的時候不把類型轉回來的而直接使用的話,是會編譯報錯的。而且即使轉換了,也可能由於轉換的類型不對產生類型不匹配。
2)效率低下
  首先考慮爲什麼會報錯,那是因爲存儲在ArrayList裏面的東西如果直接取出,得到的是一個Object引用,想要獲得我們需要的東西就需要再轉換類型到當初存入的類型。這就是裝箱與拆箱操作。
  裝箱:把“值類型”轉換成“引用類型”(Object)。
  拆箱:把“引用類型”轉換成“值類型”。
  值類型的變量直接包含數據,引用類型的變量存儲對數據的引用。
  這其中就涉及到爲新生成的引用對象分配內存、將值類型的數據拷貝到剛剛分配的內存中、返回新分配對象的地址這些操作,而分配內存和拷貝是非常消耗性能的。在數據量大的情況下,這種操作是不可取的。
 

3)List < T >

優點:
1)性能:這是不需要類型轉換的,可以避免值類型和引用類型之間拆裝箱帶來的性能損失。
2)類型安全:限制了使用的數據類型,在編譯時就可以檢查類型錯誤。
 
這個應該都很熟悉了。這是在ArrayList之後,也就是c#2.0添加的泛型,很明顯,他修正了ArrayList的缺點,限制了類型,也不需要拆裝箱,極大的提高了性能。
   

注意點

其實在這裏應該可以注意到。裝箱和拆箱是值類型和引用類型之間的轉換,但是如果存儲的本身就是引用類型呢?那麼就不涉及拆裝箱的問題,所以如果本身就是引用類型,那麼ArrayList和List< T >的差距就沒那麼大了。但是,不論如何,List< T >是類型安全的。
 
 

二、ListDictionary、LinkedList

ListDictionary單項鍊表,LinkedList雙向鏈表。其結構就不多贅述了,主要說一下與數組的比較。
比較:
1)、位置:
  數組中的位置有其下標決定,也就是順序決定,在內存中時連續的。
  鏈表中的位置由其節點內的引用關係決定,在內存中是可以不連續的。
2)、插入與中間刪除:
  數組的插入與中間刪除效率低,需要大量操作後置元素。
  鏈表的插入與中間刪除效率高,只需修改插入位置的前置與後置元素的引用即可,操作簡單。
3)查找:
  數組查找效率高,查找方便。有隨機性,可以直接根據下標獲取數組內任一元素。
  鏈表查找效率比較低,不能下標查找,不具有隨機性。需要從已知節點(通常是頭結點)開始按照鏈式一個一個向下尋找。
4)內存:
  數組內存要求高,需要求複合要求的連續內存空間。
  鏈表內存要求低,不需要連續空間。
5)擴展:
  數組不能動態擴展,上面的數組其底層都是由Array實現的,都會有一個默認的初始長度,而且當長度不夠時會將當前容量擴容2倍,不可避免的會造成內存浪費。
  鏈表能夠動態擴展,因爲是不連續的鏈接節點,所以有多少節點就佔用多少內存,不造成內存浪費。
 
 

三、Stack、Queue

Stack棧、Queue隊列,比較普遍了。簡單的提一句。
棧是後進先出,通常用於就近或者優先級,比如後退功能,歷史記錄,符號運算等。
隊列是先進先出,通常用於順序執行,任務之類。
 
 

三、Dictionary<TKey, TValue>

Dictionary字典是非常常用的一種結構:Dictionary<[key], [value]>,每個元素的存儲都是個鍵值對,key和value可以是任意類型(但必須聲明類型),通過唯一的key值獲取需要的內容。
  字典的好處在於綜合了上面List和鏈表的優點,操作的時候可以把這個key值當做list中的下標,隨機性獲得其中任何一個value。而且插入時也不需要考慮其他元素的位置。
  不過對於字典的使用,由於是鍵值對,我們的獲取是通過Key值找到相應的value。所以他的存儲是映射方式,通過哈希算法極大的提高的索引效率(哈希算法可以自行百度),但相對的佔用的內存空間也更大,也就是通過更大的空間佔比提高的時間效率。

 
 
 
 
 
 
由於時間問題,後面說的越來越淺了,以後會回來補充的~
有不對的地方歡迎指正~ 謝謝 ~ 一起學習~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章