首页 > 其他分享 >HashSet

HashSet

时间:2023-03-17 18:14:31浏览次数:31  
标签:set Console HashSet 元素 Add 集合

HashSet

定义

命名空间: System.Collections.Generic
程序集: System.Collections.dll

类型参数

T(哈希集中的元素类型)

注释

类 HashSet 提供高性能集操作。 集是不包含重复元素且其元素没有特定顺序的集合。
元素唯一,不重复,区分大小写
不能使用下标来访问元素(for循环不可使用)

备注:
HashSetIReadOnlyCollection实现从 .NET Framework 4.6 开始的 接口;在早期版本的 .NET Framework中HashSet, 类未实现此接口。

HashSet对象可容纳的元素数量,当添加元素时会自动增加。但是不会自动减少
HashSet类可被视为没有Dictionary<TKey,TValue>值的集合。
集合HashSet未排序,并且不能包含重复的元素。如果顺序或元素重复比应用程序的性能更重要,请考虑将List类与Sort方法一起使用。

HashSet 提供了许多数学集运算,如下:

HashSet 操作 数学等效项
UnionWith 联合或集添加
IntersectWith 交叉 口
ExceptWith 设置减法
SymmetricExceptWith 对称差异

仅.NET Framework: 对于非常大HashSet的对象,可以通过在运行时环境中将配置元素的 属性设置为 enabled ,将 64 位系统上的最大容量增加到 true 20 亿个元素。

从 .NET Framework 4 开始, HashSet 类实现 ISet 接口。

HashSet 和 LINQ Set 运算

LINQ 集操作和 HashSet 操作之间的主要区别在于,LINQ 集操作始终返回新 IEnumerable 集合,而 HashSet 等效的方法会修改当前集合。

HashSet 操作 LINQ 等效项
UnionWith Union
IntersectWith Intersect
ExceptWith Except
未提供。 Distinct
SymmetricExceptWith 未提供。
Overlaps 未提供。
IsSubsetOf 未提供。
IsProperSubsetOf 未提供。
IsSupersetOf 未提供。
IsProperSupersetOf 未提供。
SetEquals 未提供。

HashSet 的优势和与 List 的比较

HashSet 最大的优势是检索的性能,简单的说它的 Contains 方法的性能在大数据量时比 List 好得多。

在内部算法实现上,HashSet 的 Contains 方法复杂度是 O(1),List 的 Contains 方法复杂度是 O(n),后者数据量越大速度越慢,而 HashSet 不受数据量的影响

这里的方法复杂度就是 时间复杂度 和 空间复杂度 的综合评定,时间复杂度 和 空间复杂度怎么定义,可以百度一下,这里不做讲解

所以在集合的目的是为了检索的情况下,我们应该使用 HashSet 代替 List 。比如一个存储关键字的集合,运行的时候通过其 Contains 方法检查输入字符串是否关键字。

代码展示


#region 添加元素
Console.WriteLine("1. 添加元素 \r\n ");
var set = new HashSet<string>();
// Add 方法会返回 bool值,添加数据时,如果集合中已经存在,则忽略这次操作,并返回false
// 无法添加不同数据类型的元素
// set.Add(8);
set.Add("a");
set.Add("b");
set.Add("c");
set.Add("d");
set.Add("A");

FHashSet(set);  // 打印元素
SignLine();     // 分割线
#endregion

#region 检查元素是否存在
Console.WriteLine("2. 集合中是否存在 a 元素?");
if (set.Contains("a")) 
    Console.WriteLine("是"); 
else 
    Console.WriteLine("否");
SignLine();
#endregion

#region 将当前集合的容量设置为它包含的实际元素数
Console.WriteLine("将当前集合的容量设置为它包含的实际元素数: \r\n");
var set2 = new HashSet<string>(10);
set2.Add("A");
set2.Add("B");
set2.Add("C");
set2.TrimExcess();
SignLine();
#endregion

#region 移除当前集合中包含指定集合的元素
Console.WriteLine("移除当前集合中包含指定集合的元素: \r\n");
string[] strs = { "a", "b" };
set.ExceptWith(strs);
FHashSet(set2);
SignLine();
#endregion

#region 修改为两个集合之间的交集
Console.WriteLine("修改为两个集合之间的交集: \r\n");
string[] str2 = { "异", "A", "B", "C", "E", "E" };
set.IntersectWith(str2);
FHashSet(set);
SignLine();
#endregion

#region 修改为两个集合之间的并集
Console.WriteLine(" 6.修改为两个集合之间的并集: \r\n");
Console.WriteLine(" set : A, B, C, E, D 长度:{0}", set.Count);
Console.WriteLine(" set2: 1, A, 2, B    长度:{0}", set2.Count);
set.UnionWith(set2);
FHashSet(set);
#endregion

结果:
img

标签:set,Console,HashSet,元素,Add,集合
From: https://www.cnblogs.com/skc-6/p/17227743.html

相关文章

  • 说一下 HashSet 的实现原理?
    HashSet是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75的HashMap。封装了一个HashMap对象来存储所有的集合元素,所有放入HashSet中的集合元素......
  • HashSet 源码解读
    1.创建HashSetSet<String>set=newHashSet<>();set.add("aaa");2.构造方法privatetransientHashMap<E,Object>map;/***Constructsanew,emptyset;......
  • java HashSet 原理
    其实就是HashMap,明白了HashMap就会明白HashSet原理创建HashSet底层就是创建了一个HashMapHashSet添加一个元素就是往HashMap添加一个元素HashSet获取元素,......
  • HashSet 与 List 性能
    很明显,通用HashSet<T>类的搜索性能高于通用类List<T>。只需将基于散列的密钥与类中的线性方法进行比较即可List<T>。然而,计算哈希键本身可能需要一些CPU周期,因此对......
  • java HashSet集合存储学生对象并遍历
         ......
  • HashSet类
    Set接口的特点是无序和不重复上图就是无序的体现,HashSet底层数据结构是数组+链表,虽然数组有索引,但是数据并不是按索引来存放而是先通过Hash算法来给出各个数据存放的位......
  • HashSet的使用以及存储方式
    packageedu.wtbu;importjava.util.HashSet;importjava.util.Iterator;publicclassDemo01{publicstaticvoidmain(String[]args){//HashSet:存储结......
  • HashSet
    HashSet基于HashMap来实现的,是一个不允许有重复元素的集合;HashSet允许有null值;HashSet是无序的,即不会记录插入的顺序;HashSet不是线程安全的;HashSet实现了Set接口......
  • java中的HashSet内部是如何工作的
    HashSet的内部采用HashMap来实现。由于Map需要key和value,所以HashSet中所有key的都有一个默认value。类似于HashMap,HashSet不允许重复的key,只允许有一个nullke......
  • HashSet底层解析
    底层基于hashmap实现,构造函数中会new一个HashMap实例,hashset中的元素都放在hashmap中,key是元素本身,value为PRESENT,PRESENT定义:privatestaticfinalobjectPRESENT =......