关于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

相关推荐
NGC_66115 分钟前
CMS收集器详解
java·开发语言·jvm
旺仔.2916 分钟前
死锁 详解
linux·开发语言·计算机网络·安全
Sunsets_Red8 分钟前
乘法逆元的 exgcd 求法
c++·学习·数学·算法·c#·密码学·信息学竞赛
I love studying!!!11 分钟前
python项目: 下载数据
开发语言·python
不只会拍照的程序猿14 分钟前
《嵌入式AI筑基笔记03:Python流程控制,从C的严谨到Python的简洁》
c语言·开发语言·笔记·python
问今域中16 分钟前
java技术史001:EJB 侵入性的历史阵痛与 Spring 的突围
java·开发语言·rpc
BUG创建者18 分钟前
openlayers上跟据经纬度画出轨迹
开发语言·javascript·vue·html
23.20 分钟前
【Java】NIO零拷贝技术揭秘:CPU不参与的数据传输
java·开发语言·nio
宸津-代码粉碎机21 分钟前
SpringBoot 任务执行链路追踪实战:TraceID 透传全解析,实现从调度到执行的全链路可观测
开发语言·人工智能·spring boot·后端·python
茉莉玫瑰花茶26 分钟前
CMake 工程指南 - 工程场景(5)
开发语言·c++·cmake