數組結構:node
Array :在內存上是連續分配的,並且元素類型是一致的;數組
特色:是讀取快 能夠座標訪問 可是增刪慢,長度不能變安全
好比 int[] intArray=new int[20]; intArray[3]=10;數據結構
ArrayList:在內存上是連續分配的,元素沒有類型限制,任何元素都是當成object處理的,若是是值類型,會有裝箱操做spa
不定長度的 Add增長長度 索引賦值不會增長長度;讀取快 增刪慢;線程
ArrayList arrayList=new ArrayList();排序
arrayList.Add("001");索引
arrayList.Add("002");接口
arrayList.Remove("Eleven");隊列
array[2]=32;
//刪除數據
List:核心也是Array 內存上是連續分配的 能夠用索引訪問 不定長度 ;泛型,保證類型安全,避免裝箱拆箱;讀取快,增刪慢;
List<string> stringList=new List<string>();
stringList.Add("001");
鏈表類型
LinkedList:泛型的,鏈表 元素不連續分配,每一個元素都有記錄先後節點;
不能經過座標訪問, 找元素,只能遍歷,查找不方便;增刪比較方便;
LinkedList<int> linkedList=new LinkedList<int>();
linkedList.AddFirst(1);
linkedList.AddLast(10);
bool isContain=linkedList.Contains(123);
LinkedListNode<int> node123=linkedList.Find(123);
linkedList.AddBefore(node123,10);
linkedList.AddAfter(node123,11);
linkedList.Remove(123);
linkedList.RemoveFirst();
linkedList.RemoveLast();
Queue: 隊列,就是鏈表, 先進先出, 如任務延遲執行,A不斷地寫入任務 B不斷獲取任務去執行;
Queue<int> numbers=new Queue<int>();
numbers.Enqueue(1);
numbers.Enqueue(2);
numbers.Enqueue(3);
numbers.Dequeue();//移除
numbers.Peek();//不移除
Stack: 棧,是鏈表, 先進後出
Stack<int> numbers=new Stack<int>();
numbers.Push(1);
numbers.Push(2);
numbers.Push(3);
numbers.Push(4);
numbers.Pop();//讀取並移除
numbers.Peek();//讀取不移除
集合Set
HashSet:hash分佈 元素間沒有關係 動態增長的 會自動去重 不是連續分佈 不能用索引座標訪問
統計用戶IP,IP投票;還能夠作交叉並補的集合
HashSet<int> hashSet=new HashSet<int>();
hashSet.AddFirst(1);
hashSet.AddFirst(1);
hashSet.AddFirst(2);
hashSet.AddFirst(3);
hashSet.AddLast(10);
HashSet<int> hashSet1=new HashSet<int>();
hashSet1.AddFirst(1);
hashSet1.AddFirst(2);
hashSet1.AddLast(3);
hashSet1.AddLast(7);
hashSet1.IntersectWith(hashSet);//交集 一、二、3
hashSet1.UnionWith(hashSet);//並集一、二、三、七、10
hashSet1.ExceptWith(hashSet);//差集 10
hashSet1.SymmetricExceptWith(hashSet);//補集 7
*交叉並補只能執行一次*
SortedSet:排序的集合,能夠去重加排序;也能夠作交叉並補
SortSet<int> sortSet=new SortSet<int>();
sortSet.AddFirst(1);
sortSet.AddFirst(1);
sortSet.AddFirst(2);
sortSet.AddFirst(3);
sortSet.AddLast(10);
Key-Value
HashTable:key—value 體積能夠動態增長 拿着key計算一個地址,而後放入key-value
object-裝箱拆箱 若是是不一樣的key獲得相同的地址,第二個在前面地址上+1
查找的時候,若是地址對應的數據key不對,那就+1查找。。
浪費了空間 基於數組實現
查找數據 一次定位 增刪 一次定位;增刪改查 都很快
浪費空間,數據太多 重複定位 效率就下去了
HashTable table=new HashTable();
table.Add("1","0001");
table.Add("2","0004");
table["3"]="0003";
線程安全
Hashtable.Synchronized(table);//只有一個線程寫 多個線程讀
Dictionary:泛型 key-value 讀寫增刪改查都很快 有序的
Dictionary<int,string> dic=new Dictionary<int,string> ();
dic[1]="1";
SortedDictionary:泛型 key-value 讀寫增刪改查都很快 有序的
SortedDictionary<int,string> dic=new SortedDictionary<int,string> ();
dic[1]="1";
SortedList:泛型 key-value 讀寫增刪改查都很快 有序的 按照key排序
SortDictionary<int,string> dic=new SortDictionary<int,string> ();
dic[1]="1";
ILIst、IQueryable、IEnumerable、ICollection
接口是標識功能的,不一樣的接口拆開,爲了接口隔離,儘管有重複
IList 能夠下標訪問
IEnumerable 遍歷纔會查詢比較 迭代器yield 任何數據集合 都實現了不一樣的數據結構,提供了統一的訪問接口 yield訪問模式
IQueryable 表達式目錄樹解析 延遲到遍歷的時候纔會去執行