HashSet和Python中的Set差不多,都是为逻辑运算准备的,HashSet不允许数据有重复,且存入的时单值不是键值对。
HashTable和Dictionary差不多,但是他们的实现方式时不同的,Dictionary俗称字典,里面存放的时键值对,即KeyValuePair,且支持泛型,而HashTable国内一般译为哈希表,但是在我看来,为了更好表达它的本质,翻译为散列表比较好,因为HashTable里面村的key时以散列的方式存储的,但是Dictionary里面是按顺序的方式存的KeyValuePair。

实践了才能记得住,所以此处以LeetCode第500题为例来说明这一点。

    public string[] FindWords(string[] words)
{
for(int i=0;i<words.Length;i++)
{
words[i] = words[i].ToLower();
}

string arr1 = "qwertyuiop";
string arr2 = "asdfghjkl";
string arr3 = "zxcvbnm";
HashSet<int> map1 = new HashSet<int>();
Dictionary<char, int> map2 = new Dictionary<char, int>();
Hashtable map3 =new Hashtable();

for(int i=0;i<arr1.Length;i++)
{
map1.Add(i);
map2.Add(arr1[i], 1);
map3.Add(arr1[i], 1);
}
for(int i=0; i<arr2.Length;i++)
{
map1.Add(i);
map2.Add(arr2[i], 2);
map3.Add(arr2[i], 2);
}
for(int i=0; i<arr3.Length;i++)
{
map1.Add(i);
map2.Add(arr3[i], 2);
map3.Add(arr3[i], 2);
}
int flag = 0;
List<string> lstStr = new List<string>();
for(int i=0; i<words.Length;i++)
{
flag = 0;
for(int j=0;j<words[i].Length;j++)
{
if(map2[words[i][0]] != map2[words[i][j]])
{
flag = 1;
break;
}

}
if(flag == 0)
lstStr.Add(words[i]);
}

return lstStr.ToArray();
}

其中map1是HashSet,map2是Dictionary, map3是HashTable,但是若将if判断中的map2改成map3会怎么样呢?看看这一段代码

object a = 1;
object b = 1;
Console.WriteLine(a.GetType());
if(a==b)
{
Console.WriteLine("a==b");
}

结果是a不等于b,为什么呢,因为他们内容相同但是地址不同,但是将==改为equals的比较就可以了,具体请查阅equals和==的区别(注意这里略绕哦)。

这里面的问题在于HashTable总是把所有变量当成Object所以才会出这个问题,而Dictionary类型则是指定key和value的类型。

另外Dictionary数据结构再单线程使用会比较快,存放值类型的数据也会比HashTable快,这是因为HashTable对于存入的数无论是值类型还是引用类型都会变成object类型关于这一点,再看一个小例子。

https://blog.csdn.net/github_34777264/article/details/79625374

C#中的HashSet, HashTable, Dictionary的区别【转】的更多相关文章

  1. HashTable、HashSet和Dictionary的区别

    今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTable和Dictionary相关的知识,记录下来,希望对后来人有所帮助,以及对自己以后复习可以参考. 1 ...

  2. HashTable、HashSet和Dictionary的区别(转载)

    1.HashTable哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类 ...

  3. C#高级应用之------HashTable、HashSet和Dictionary的区别(转)

    原文url:http://www.cnblogs.com/akwwl/p/3680376.html 今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTabl ...

  4. hashset hastable dictionary concurrentdictionary区别

    1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...

  5. HashSet HashTable HashMap的区别 及其Java集合介绍

    (1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...

  6. HashSet HashTable HashMap的区别

    (1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...

  7. ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  8. LinkedList,ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系

    在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...

  9. 集合Hashtable Dictionary Hashset

    #region Dictionary<K,V> Dictionary<string, Person> dict = new Dictionary<string, Pers ...

随机推荐

  1. codevs 5929 亲戚

    5929 亲戚 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold       题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不 ...

  2. BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)

    BZOJ 洛谷P4363 [Update] 19.2.9 重做了遍,感觉之前写的有点扯= = 首先棋子的放置情况是阶梯状的. 其次,无论已经放棋子的格子上哪些是黑棋子哪些是白棋子,之前得分如何,两人在 ...

  3. VM 虚拟机网络配置

    VM网络设置,一共有四种模式. 分别是 1:bridge:桥接,直接和真实网卡相连.如果你要让虚拟机也要上网,就必须选这项,并且要配置和真实网卡在同一网段的IP地址. 2:host-only: 仅主机 ...

  4. CENTOS下搭建SVN服务器(转)

    1.安装svn yum install -y subversion 2.验证安装是否成功 svnserve --version 3.创建svn版本库 mkdir svn svnadmin create ...

  5. go中的接口

    对于golang的接口,纠结两天了,今天有种茅塞顿开的感觉,有必要写点东西了. 纠结接口,说白了就是搞不透接口,方法,结构体几者之间的关系以及具体的用途.可以简单的从三者的定义说起,接口说白了就是一个 ...

  6. 【Go命令教程】3. go install

    命令 go install 用于编译并安装指定的代码包及它们的依赖包.当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包.与 go build 命令一样,传给 go install 命 ...

  7. Jenkins CI CD

    原文:https://www.sunjianhua.cn/archives/jenkins-ci-cd.html 1.安装git 以下为简单应用,适合无gitlab服务器用户. #在git服务器(19 ...

  8. 【mysql】sum处理null的结果

    SELECT IFNULL() createSCNum, IFNULL() privateScNum FROM security_code_config WHERE tid = 'test_tenem ...

  9. .NET:如何并行的从集合中返还元素?

    实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  10. socket tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...