C#中的HashSet, HashTable, Dictionary的区别【转】
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的区别【转】的更多相关文章
- HashTable、HashSet和Dictionary的区别
今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTable和Dictionary相关的知识,记录下来,希望对后来人有所帮助,以及对自己以后复习可以参考. 1 ...
- HashTable、HashSet和Dictionary的区别(转载)
1.HashTable哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类 ...
- C#高级应用之------HashTable、HashSet和Dictionary的区别(转)
原文url:http://www.cnblogs.com/akwwl/p/3680376.html 今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTabl ...
- hashset hastable dictionary concurrentdictionary区别
1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...
- HashSet HashTable HashMap的区别 及其Java集合介绍
(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...
- HashSet HashTable HashMap的区别
(1)HashSet是set的一个实现类,hashMap是Map的一个实现类,同时hashMap是hashTable的替代品(为什么后面会讲到). (2)HashSet以对象作为元素,而HashMap ...
- ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- LinkedList,ArrayList,Vector,HashMap,HashSet,HashTable之间的区别与联系
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- 集合Hashtable Dictionary Hashset
#region Dictionary<K,V> Dictionary<string, Person> dict = new Dictionary<string, Pers ...
随机推荐
- Ubuntu 18.04 安装 virtualbox
1.安装包下载地址 [https://www.virtualbox.org/wiki/Linux_Downloads] 2.进入软件包的文件夹 sudo dpkg -i 安装包的名字.deb [注]如 ...
- 【学习笔记】python2和python3的input()
python2中的input()只接受变量作为传入值,非变量内容会报错. >>> user=input("Enter your name:") Enter you ...
- CentOS 7 yum 安装mysql5.6
到mysql社区安装当前可用包 Centos 7 命令 # rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noar ...
- MAC下安装Homebrew 和 @权限的问题
MAC下安装Homebrew和 @权限的问题 1.Homebrew简介: Homebrew是一个包管理器,用于安装Apple没有预装但你需要的UNIX工具.(比如著名的wget). Homebrew会 ...
- Python 訪问 LinkedIn (API)
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-16 @author: guaguastd @name: l ...
- how convert large HEX string to binary array ?
how convert large HEX string to binary I have a string with 14 characters . This is a hex represanta ...
- 通过webbrowser控件获取验证码
1.首先介绍下基本控件(拖控件大家都会,我就不一一介绍了),看下图: 2.添加MSHTML引用,步骤如下: 解决方案—右键“引用”—添加引用—在.NET下找到Microsoft.mshtml组件—点 ...
- ASP.NET 2.0
http://www.cnblogs.com/linezero/p/nightlynetcore2.html
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
- 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性
委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...