泛型支持多类型,但需要指定类型,不用转换类型,不用装箱/拆箱操作,效率更高,使用范围广。
C# 官方源码地址
https://referencesource.microsoft.com/
C# 官方文档地址
https://docs.microsoft.com/en-us/dotnet/api/?view=netframework-4.8
根据源码的接口派生关系,可得到UML图
Array
ArrayList
存储结构是array
List<T>
存储结构是array
,比ArrayList
多了泛化
HashTable
存储结构为bucket
结构体,包含key,value
和hash_coll
Dictionary<Tkey, TValue>
存储结构比HashTable
多一个next
字段,和python3.6
之后的字典多了indices
一样,为了有序
用一段代码验证一下猜想
using System;
using System.Collections;
using System.Collections.Generic;
class Test {
public static void Main()
{
Hashtable ht1 = new Hashtable();
ht1.Add(3,"C");
ht1.Add(2,"B");
ht1.Add(1,"A");
foreach(var v in ht1.Values)
{
Console.WriteLine(v);
}
Dictionary<int,string> dict1 = new Dictionary<int,string>();
dict1.Add(3,"C");
dict1.Add(2,"B");
dict1.Add(1,"A");
foreach(var k in dict1)
{
Console.WriteLine(k);
}
}
}
>>>
A
B
C
[3, C]
[2, B]
[1, A]
果然Dictionary
是按顺序添加的,HashTable
则不保证先后顺序
LinkedList<T>
储存结构是LinkedListNode
Stack<T>
存储结构是array
,当容量小于90%时会换个小的数组(手动调用TrimExcess
,好像不会自动调用),push
时容量满了会2倍扩容
Queue<T>
和stack
不同的是,_head
和 _tail
的更新需要加1和数组长度取模,这样做的好处是在出队后再入队的情况下节省空间,不用一直扩容
HashSet<T>
存储结构是m_buckets
和m_slot
,桶数组存相同hash
指,slot
存放hash
映射的值,当冲突时通过next
把元素串起来,是链地址法。