C#常用容器源码分析

泛型支持多类型,但需要指定类型,不用转换类型,不用装箱/拆箱操作,效率更高,使用范围广。

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,valuehash_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_bucketsm_slot,桶数组存相同hash指,slot存放hash映射的值,当冲突时通过next把元素串起来,是链地址法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值