一陕凹,數(shù)組 Array
特點(diǎn):
數(shù)組存儲(chǔ)在連續(xù)的內(nèi)存上悍抑;數(shù)組的內(nèi)容類型都相同;數(shù)組可以通過下面進(jìn)行直接訪問杜耙;
創(chuàng)建過程:
創(chuàng)建一個(gè)新的數(shù)組時(shí)將在CLR托管堆中分配一塊連續(xù)的內(nèi)存空間來存放數(shù)量為size搜骡,類型為所聲明類型的數(shù)組元素,如果類型為值類型佑女,則將會(huì)有size個(gè)未裝箱的該類型的值被創(chuàng)建记靡,如果是引用類型,將會(huì)有size個(gè)相應(yīng)類型的引用被創(chuàng)建团驱;
攜帶方法: 略
優(yōu)劣:
由于內(nèi)存連續(xù)摸吠,所以索引速度非常快嚎花,訪問一個(gè)元素的速度與元素的數(shù)量無關(guān)寸痢,且賦值和修改都非常簡單;
同樣紊选,由于內(nèi)存連續(xù)且聲明的時(shí)的長度是固定的啼止,在插入新元素和長度初始聲明時(shí)會(huì)存在風(fēng)險(xiǎn);
拓展1:裝箱和拆箱
基礎(chǔ)知識(shí):
值類型在棧中分配內(nèi)存兵罢,在聲明初始化才能使用献烦,且不能為null;值類型超出作用范圍系統(tǒng)自動(dòng)釋放內(nèi)存趣些;主要由結(jié)構(gòu)(整型仿荆,浮點(diǎn)型,decimal,bool拢操,用戶自定義struct結(jié)構(gòu))和 枚舉(enum)組成锦亦;
引用類型在堆中分配內(nèi)存,初始化時(shí)默認(rèn)為null令境;引用類型是通過垃圾回收機(jī)制進(jìn)行回收杠园;包括類,接口舔庶,委托抛蚁,數(shù)組以及內(nèi)置的引用類型object和string;
事件原因:
由于c#中所有的數(shù)據(jù)類型都是由基類System.Object繼承而來惕橙,所以瞧甩,值類型和引用類型的值是可以通過顯式或隱式操作來相互轉(zhuǎn)換,而這個(gè)過程就是裝箱(boxing)和拆箱(unboxing)過程弥鹦;
裝箱:
裝箱是? 值類型? 到object類型? 或? 到此值類型所實(shí)現(xiàn)的任何接口的隱式轉(zhuǎn)換(轉(zhuǎn)為接口依舊要裝箱)肚逸;對(duì)值類型裝箱會(huì)在堆中分配一個(gè)對(duì)象實(shí)例,并將該值復(fù)制到新的對(duì)象中彬坏;
拆箱:
拆箱是? object類型到值類型? 或? 從接口類型到實(shí)現(xiàn)該接口的值類型的顯示轉(zhuǎn)換朦促;
取消拆箱:
檢查對(duì)象實(shí)例骄呼,確保它是給定值類型的一個(gè)裝箱值(拆箱后沒有轉(zhuǎn)成原類型惜傲,編譯時(shí)不會(huì)出錯(cuò),但是運(yùn)行會(huì)出錯(cuò)翘贮;用GetType.ToString()判斷時(shí)一定要使用類型全稱幻赚,如System.String 替換掉 String)禀忆;
將該值從實(shí)例賦值到值類型變量中;
頻繁的裝箱和拆箱對(duì)性能的影響很大坯屿;故手動(dòng)的操作很重要
二油湖,ArrayList
特點(diǎn):
消除了數(shù)組創(chuàng)建時(shí)必須指定長度所帶來的風(fēng)險(xiǎn);它屬于System.Collections命名空間下的一部分领跛;
可以存儲(chǔ)不同類型的元素(元素會(huì)都會(huì)統(tǒng)一當(dāng)成Object來處理? => 加入不同類型元素是被允許的)乏德;
創(chuàng)建過程:
ArrayList arryListname = new ArrayList();
攜帶方法:略
優(yōu)劣:
由于ArrayList把不同的類型都當(dāng)成Objec來處理
=>所以很可能在使用時(shí)發(fā)生類型不匹配問題,所以吠昭,ArrayList不是類型安全的喊括;
=>會(huì)不斷的裝箱;時(shí)間損耗同時(shí)也會(huì)效率降低
三矢棚,List<T> 泛型List
特點(diǎn):
長度可以靈活改變郑什;
內(nèi)部實(shí)際是Array來實(shí)現(xiàn)的;
創(chuàng)建過程:
List <string> stringList = new List<string>();
攜帶方法:略
優(yōu)劣:
保證了類型安全蒲肋; 取消了裝箱和拆箱的操作蘑拯;融合了ArrayList的長度自由變化钝满;
四,LinkedList<T> 鏈表
特點(diǎn):
鏈表在內(nèi)存存儲(chǔ)傻的排序上可能是不連續(xù)的申窘;
鏈表是通過上一個(gè)元素指向下一個(gè)元素來排序弯蚜,不能通過下標(biāo)來訪問;
不用動(dòng)態(tài)擴(kuò)充長度剃法;
創(chuàng)建過程:
LinkedList<string> myLinkedList = new LinkedList<string>();
攜帶方法: 略
優(yōu)劣:
由于內(nèi)存存儲(chǔ)的不一定連續(xù)性碎捺,訪問無法通過下標(biāo),必須從開始節(jié)點(diǎn)開始遍歷贷洲,逐次遍歷下一個(gè)節(jié)點(diǎn)直到找到目標(biāo)收厨,所以查找方面無法與Array相比;
由于沒有連續(xù)內(nèi)存存儲(chǔ)优构,所以在增減節(jié)點(diǎn)(插入刪除)操作上很便利诵叁;
鏈表適合元素?cái)?shù)量不穩(wěn)定且經(jīng)常操作兩端來增減節(jié)點(diǎn)的情況;
五俩块,Queue<T> 隊(duì)列
特點(diǎn):
一種先入先被刪除(first in first out)的線性表;
默認(rèn)情況下黎休,初始容量為32浓领;增長因子為 2.0玉凯, 使用TrimExcess來降低容量;
加入元素時(shí)联贩,將通過又一次分配內(nèi)部數(shù)組來依據(jù)須要自己主動(dòng)增大容量漫仆;
能接受null作為有效值,并且允許重復(fù)的元素;
創(chuàng)建過程:
Queue<int> q = new Queue<int>();
攜帶方法:
q.Enqueue(1); q.Enqueue(2); q.Enqueue(3); q.Enqueue(4);???? //依次放入1泪幌,2盲厌,3,4
q.Count();? ? ?//返回隊(duì)列中元素的數(shù)量
q.Dequeue();? ????//取出排在第一的元素祸泪, 隊(duì)列中只剩下2吗浩,3,4
q.Peek();? ? ?//查看隊(duì)列中的第一元素没隘, 只是查看懂扼,沒有取出, 隊(duì)列中還有2右蒲,3阀湿,4
foreach(int y in q) { cw{y}};? ? //遍歷查看隊(duì)列中的元素
q.TrimExcess();重置隊(duì)列容量(將容量設(shè)置為隊(duì)列中元素的實(shí)際數(shù)目)
....
注意:
若要區(qū)分空值和 Queue 結(jié)尾瑰妄,請(qǐng)檢查 Count 屬性或捕捉 Queue 為空時(shí)引發(fā)的 InvalidOperationException異常陷嘴;
六,Stack<T>
特點(diǎn):
一種先入后出(first in last out)的線性表;默認(rèn)情況下间坐;
增長因子為 2.0灾挨, 使用TrimExcess來降低容量邑退;
加入元素時(shí),將通過又一次分配內(nèi)部數(shù)組來依據(jù)須要自己主動(dòng)增大容量劳澄;
能接受null作為有效值瓜饥,并且允許重復(fù)的元素;
創(chuàng)建過程:
Stack<T> s = new Stack<T>():
攜帶方法:
Puch();? ? ?//添加一個(gè)值到集合頂部
Pop();? ? //刪除一個(gè)頂部一個(gè)值
Peek();? ? ? //查看頂部值
...
七,Dictionary<K,T>
特點(diǎn):
元素為鍵值對(duì)浴骂,鍵必須唯一乓土,鍵值都可以是任何類型;通過鍵讀取一個(gè)值的時(shí)間復(fù)雜度為O(1);
內(nèi)部維持的是兩個(gè)數(shù)組溯警;
創(chuàng)建過程:
Dictionary<K, T> D = new Dictionary<K, T>();
攜帶方法:
Add(“a”趣苏,“aa”);? ? ?//添加字符串結(jié)構(gòu)
D["a"];? ? ?//取值,得到aa
D["a"] = ''bb";? ? ? //修改key為a的值為“bb”
D.Remove("a");? ? //刪除元素
D.ContainsKey("a");? ? ? //判斷key是否存在
foreach (string key in D.Keys){ Console.WriteLine("Key = {0}", key);}? ? //遍歷key
foreach (string key in D.Values){ Console.WriteLine("Key = {0}", key);}? ? //遍歷value
foreach (KeyValuePair<string, string> kvp in D){Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);}? ? ? //遍歷字典
...
注意:
空間換時(shí)間的字典梯轻,啥都能剛食磕!
結(jié)論:
Array 需要處理的元素?cái)?shù)量確定并且需要使用下標(biāo)時(shí)可以考慮,不過建議使用List<T>
ArrayList 不推薦使用喳挑,建議用List<T>
List<T>泛型List 需要處理的元素?cái)?shù)量不確定時(shí) 通常建議使用
LinkedList<T> 鏈表適合元素?cái)?shù)量不固定彬伦,需要經(jīng)常增減節(jié)點(diǎn)的情況,2端都可以增減
Queue<T> 先進(jìn)先出的情況
Stack<T> 后進(jìn)先出的情況
Dictionary<K,T> 需要鍵值對(duì)伊诵,快速操作