在Unity有一個與數據容器息息相關的命名空間:System.Collections.Generic
,其包含用于定義泛型集合的接口和類,可允許用戶創(chuàng)建強類型集合,以提供比非泛型強類型集合更好的類型安全性和性能
本篇博客用來介紹這些通過泛型實現的安全類型的數據容器(ArrayList
是一個例外),話不多說,直接開始
特點:
數組是一種線性結構,需要聲明長度 通過下標查找時間復雜度為O(1) 插入刪除比較復雜
常用屬性:
Length
:獲取出數組所有維度的長度
Rank
:獲取數組的維度
方法:
Clear(Array, Int32, Int32)
:在指定數組的某一范圍將數組恢復為默認值(比如整數數組歸零)
Sort(Array)
:對于數組中的元素進行排序
Clone()
:創(chuàng)建Array副本
GetType()
:獲取當前數組實例的Type
Initialize()
:通過調用值類型的無參數構造函數,初始化值類型 Array 的每一個元素
Reverse(Array)
:反轉數組中元素的順序
使用方式:
通過下面的代碼來理解一些關鍵屬性方法的使用方式:
int[] nums = new int[] { 2, 7, 11, 15 }; //leangth來獲取數組的長度 Console.WriteLine(nums.Length); //對數組中元素進行排序 Array.Sort(nums); //反轉數組中元素的順序 Array.Reverse(nums); //復制nums數組 int[] nums_Copy = (int[])nums.Clone(); //清除數組元素,將nums中所有元素變?yōu)? Array.Clear(nums, 0, nums.Length); //同樣將數組中元素恢復默認 nums.Initialize();
ArrayList核心是數組,但是是在數組的基礎上進行了擴展,首先就是其動態(tài)擴容的特點,然后再一定程度上同日出生了其查詢速度
ArrayList的使用需要引入命名方法:using System.Collections;
特點:
可以動態(tài)擴容:通過創(chuàng)建一個更大的新數組,來將原來的數組轉移到新數組
插入刪除比數組方便
類似于數組,同樣通過下標索引
存儲的是對象:
需要裝箱、拆箱操作
是不安全類型
注意
裝箱:將值類型轉換為引用類型(隱式轉換)
拆箱:將引用類型轉換為值類型(顯式轉換)
屬性
Capacity
:獲取或者設置ArrayList中可以包含的元素個數
Count
:獲取ArrayList中實際包含的元素個數
ArrayList[]
:通過下標索引
方法
Add
:添加元素在ArrayList的尾部
Clear
:清除所有元素
Contains
:確定某個元素是否在ArrayList內
Sort
:排序
使用方式
關于ArrayList
使用方式有很多與Array
相同,可以通過如下案例看出:
//創(chuàng)建 ArrayList m_arrayList = new ArrayList(); ArrayList al = new ArrayList { 1, 2, 3, 4 }; //元素插入 m_arrayList.Add("001"); m_arrayList.Add(1); //第一中遍歷方式 for(int i=0;i<m_arrayList.Count;i++) { Console.WriteLine(m_arrayList[i]); } //第二種遍歷方式 foreach(Object j in m_arrayList) { Console.WriteLine(j); }
List就是通過將泛型數據存儲在一個泛型數組中,從而實現一個數據安全類型的列表,添加元素時若超過中當前泛型數組的容量,則進行二倍擴容,進而實現List
大小動態(tài)變化
特點:
核心是數組:
可以動態(tài)擴容:同樣是創(chuàng)建新的更大數組來遷移數據
使用泛型來實現對裝箱拆箱操作的避免
內存優(yōu)化:
對于List
可以規(guī)定長度,來避免動態(tài)擴容操作,這樣就可以避免新的內存空間的消耗
相對于ArrayList
,List
避免了裝箱拆箱操作,性能表現更好
屬性:
Capacity
:獲取或設置該內部數據結構在不調整大小的情況下能夠容納的元素總數。
Count
:獲取 List 中包含的元素數。
Item[Int32]
:獲取或設置指定索引處的元素。
方法:
Add
:添加元素在List的尾部
Clear
:清除所有元素
Contains
:確定某個元素是否在List內
Sort
:排序
使用方式
通過上面的屬性方法,也可以看出其使用方式于ArrayList
差不多
//創(chuàng)建一個列表,長度確定的情況下可以規(guī)定長度,減少new的產生 List<int> nums = new List<int>(12); //向列表插入數據 nums.Add(1); nums.Add(2); //遍歷列表元素 for(int i=0;i<nums.Count;i++) { Console.WriteLine(nums[i]); } foreach(int num in nums) { Console.WriteLine(num); } //判斷某一個元素是否在列表中 if(nums.Contains(1)) { Console.WriteLine("1在列表nums中"); } //排序 nums.Sort();
特點
HashTable
類似于字典,也是鍵值對的形式
查詢速度快,插入速度慢
容量固定,根據 數組索引獲得值
//哈希表結構體 private struct bucket { public Object key;//鍵 public Object values;//值 public int hashCode;//哈希碼 }
原理:
不定長的二進制數據通過哈希函數映射到一個較短的二進制數據集,即Key
通過HashFunction
函數獲得HashCode
但是這樣的HashCode
依舊很長, 不方便索引,于是又將這些HashCode
通過哈希桶算法進行分段(一般都是取余數),這樣就會減小每一段的索引距離
特點:
鏈表插入刪除方便,查找相對于數組來說比較慢
為了解決線性表的刪除問題,對于數組,列表,數組列表插入刪除是很復雜的一件事,而鏈表則不需要對于其進行遍歷,即可實現其遍歷過程
鏈表通過遞歸實現的數據結構
其屬性方法:
屬性:
Count
:包含的節(jié)點數
First
:獲取鏈表的第一個節(jié)點
Last
:獲取鏈表的最后一個節(jié)點
方法:
AddFirst(T)
:開頭處添加指定值的節(jié)點
AddLast(T)
:結尾處添加指定的節(jié)點
Clear()
:移除所有的節(jié)點
Contains(T)
:判斷是否包含某一個值
FInd(T)
:查找包含值的第一個節(jié)點
FIndLast(T)
:查找包含值的最后一個節(jié)點
Remove():
移除指定值的第一個匹配項
RemoveFirst()
:移除位于開頭的節(jié)點
RemoveLast()
:移除位于結尾處的節(jié)點
Dictionary<TKey,TValue>
泛型類提供一組鍵到一組值的映射。 每次對字典的添加都包含一個值和與其關聯(lián)的鍵。 使用其鍵檢索值的速度非???,接近 O (1) ,因為 Dictionary<TKey,TValue>
該類是作為哈希表實現的
字典在C#中是一種很常用的數據容器,在Unity
中有很多的應用場景,尤其是框架階段,如下:
事件管理器
UI界面管理器
有限狀態(tài)機
資源加載器
對象池
特點:
索引方便,時間復雜度接近O(1)
是安全類型
鍵唯一
屬性:
Count
:獲取字典中包含的鍵值對的個數
Keys
:獲取字典中包含鍵的集合
Values
:獲取字典中包含的值的集合
方法:
Add(Key,Value)
:添加鍵值對
Clear()
:移除字典中所有鍵值對
ContainsKey(Key)
:判斷字典中是否有該鍵
ContainsValue(Value)
:判斷字典中是否有該值
Remove(Key)
:從字典中移除指定鍵的值
Remove(Key,Value)
:從元素中移除指定鍵的值,并復制給Value
TryAdd(Key,Value)
:嘗試將鍵值對插入到字典中,如果成功則返回True
使用方式:
關于字典的使用方式還是比較復雜的,主要是兩個變量以及兩者之間的對應關系的理解
//創(chuàng)建一個字典 Dictionary<string, string> peoples = new Dictionary<string, string>(); //插入鍵值對 if(!peoples.ContainsKey("小明")) { peoples.Add("小明", "男"); peoples.Add("小紅", "女"); } //遍歷字典中所有的鍵,同樣可以遍歷所有的值 Dictionary<string,string>.KeyCollection keys = peoples.Keys; foreach(string s in keys) { Console.WriteLine(s); } //遍歷字典并輸出鍵和值 foreach (KeyValuePair<string, string> kv in peoples) { Console.WriteLine(kv.Key); Console.WriteLine(kv.Value); } //修改鍵值對的值 if (peoples.ContainsKey("小明")) { peoples["小明"] = "女"; } //刪除鍵值對 if (peoples.ContainsKey("小明")) { peoples.Remove("小明"); }
隊列的特點是先進先出,主要是應用在一些特殊的場景,需要實現數據的一個先進先出的效果
特點:
先進先出
屬性:
Count
:獲取 Queue<T>
中包含的元素數
方法:
Clear()
:從 Queue<T>
中移除所有對象。
Contains(T)
:確定某元素是否在Queue<T>
中。
CopyTo(T[], Int32)
:從指定數組索引開始將Queue<T>
元素復制到現有一維Array
中。
Dequeue()
:移除并返回位于Queue<T>
開始處的對象。
Enqueue(T)
:將對象添加到 Queue<T>
的結尾處。
特點:
先進后出
底層數組,兩倍動態(tài)擴容
屬性:
Count
:獲取 Stack 中包含的元素數。
方法
Clear()
: 從 Stack<T>
中移除所有對象。
Contains(T)
:確定某元素是否在Stack<T>
中
Peek()
:返回位于 Stack<T>
頂部的對象但不將其移除。
Pop()
:刪除并返回Stack<T>
頂部的對象。
Push(T)
:在 Stack<T>
的頂部插入一個對象。