关于C#中的HashSet<T>与List<T>

HashSet<T>

表示值的集合。这个集合的元素是无须列表,同时元素不能重复。由于这个集合基于散列值,不能通过数组下标访问。

List<T>

表示可通过索引访问的对象的强类型列表。内部是用数组保存数据,不是链表。元素可重复,是有序列表,根据调用add的时间先后进行排序。每次添加删除操作会重新排序。例如有100个元素,删除掉下标99的元素后,无法再通过下标99访问数据。

性能分析

HashSet对数据的检索效率(contains函数)比List 快。HashSet存储数据时将数据通过散列函数直接映射到地址,所有取值时可以直接取到,时间复杂度为O(1)。List检索时需要一个个的进行值比较,最多需要比较到数组末尾,时间复杂度为O(n),n为元素个数。

实例分析
cs 复制代码
public static void Test()
{
    int dataCount = 10;  //数据个数
    int loopCount = 10000000; //循环次数

    Stopwatch sw = new Stopwatch();

    HashSet<int> hash = new HashSet<int>();
    List<int> list = new List<int>();
    list.AddRange(Enumerable.Range(0, dataCount)); 
    //list.Select(x => hash.Add(x));

    for (int i = 0; i < dataCount; i++)
    {
        hash.Add(i);
    }


    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        hash.Contains(999999);
    }
    sw.Stop();
    Console.WriteLine("HASH:" + sw.ElapsedMilliseconds);


    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        list.Contains(999999);
    }
    sw.Stop();
    Console.WriteLine("LIST:" + sw.ElapsedMilliseconds);

    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        hash.Add(999999999);
        hash.Remove(999999999); 
    }
    sw.Stop();
    Console.WriteLine("HASH:" + sw.ElapsedMilliseconds);


    sw.Restart();
    for (int i = 0; i < loopCount; i++)
    {
        list.Add(99999909);
        list.Remove(99999909);
    }
    sw.Stop();
    Console.WriteLine("LIST:" + sw.ElapsedMilliseconds);

}

当数据量较小时,list的增加删除性能有优势,当数据量较大,则hashset的性能有巨大优势

数据量10

数据量50

数据量1000

数据量10000

相关推荐
陳土几秒前
R语言jiebaR包使用摘要
开发语言·r语言
Evand J1 分钟前
【MATLAB】多无人机编队协同控制与三维航迹规划仿真。障碍物斥力避障,输出编队误差、控制输入、三维轨迹等
开发语言·matlab·无人机
froginwe1118 分钟前
jQuery UI 小部件方法调用
开发语言
信奥胡老师19 分钟前
B3930 [GESP202312 五级] 烹饪问题
开发语言·数据结构·c++·学习·算法
JAVA学习通27 分钟前
安脉盛 软件后端开发实习面经
java·开发语言
sycmancia34 分钟前
Qt——Qt中的事件处理(一)
开发语言·qt
Halo_tjn39 分钟前
Java IO流文件操作
java·开发语言
吴可可12340 分钟前
点在线上判定与多段线分割
算法·c#
折哥的程序人生 · 物流技术专研43 分钟前
《Java 100 天进阶之路》第23篇:缓冲区数据结构 ByteBuffer
java·开发语言·数据结构·后端·面试·求职招聘
lsx2024061 小时前
Razor VB 循环
开发语言