一、Dictionary(字典)→ Hashtable
1、Key-value Pair 键值对。成语不可以重复,但是解释可以重复。
2、Dictionary<K,V>: K即Key是键,V即value是值。
(1)Add:添加,如果重复,则报错。
(2)索引器方式设置值:可以重复设置,即使不存在也没关系,如果重复则新数据覆盖旧数据。
(3)ContainsKey,判断是否存在这个Key。
3、(常考)Dictionary<K,V>的非泛型对应的是Hashtable;List<T>——>ArrayList 。
4、Hashtable和Dictionary的关系,类似于ArrayList和List的关系。
(1)List是一个泛型的ArrayList。Dictionary可以看作是一个泛型的Hashtable。
(2)Hashtable很少用,所以只要掌握了Dictionary就差不多可以了。
5、举个例子:
string s = "Welcome to Chinaworld";Dictionary<char, int> dict = new Dictionary<char, int>();//key为字符,value为出现的次数foreach (char ch in s.ToLower()){if (dict.ContainsKey(ch))//如果dict中含有这个字符就在出现次数上增加1{//dict[ch]++;dict[ch] = dict[ch] + 1;}else{dict[ch] = 1;//如果不存在就初始化为1}}foreach (char ch in dict.Keys){Console.WriteLine("{0}出现{1}次",ch,dict[ch]);}
二、Dictionary揭秘
6、ASP.NET 程序员天天要打交道的 Application、Cache、Session、Request.Params等均由 Dictionary /Hashtable 实现。数据库中的索引也是相似的原理。
7、Dictionary为什么速度这么快?
8、查字典为什么能这么快?目录中记录了每个汉字的页码,查找的时候先看汉字的页码,再翻到指定的页就可以非常快速的找到词条了。
9、Dictionary中有一个存储键值对的区域,采用一个固定算法(散列算法,非常快,可以认为时间复杂度为O(1) )根据key来计算这个kvp存放的地址,计算key的值的键值对应该存储的地址,将键值对放入指定的地址即可。查找的时候首先计算key的地址,就可以找到数据了。根据key找房间号,而不是逐个房间找。
三、其他集合类
10、HashSet<T>:不能盛放重复的数据,重复的数据只保留一份。Add(T value)添加元素;Contains(T value)判断是否存在元素。HashSet使用了和Dictionary类似的算法,因此Contains方法效率非常高,时间复杂度为O(1)。
11、面试题:取出整数数组中不重复数据的个数,{30,31,99,38,31,99,50}。
12、面试题:现有1~10共10个整数,已随机放入一个有8个元素的数组a[8]。要求找出没有被放入数组的那2个数。注意:程序不用实现自然数随机放入数组的过程,测试数据{9,8,5,3,1,10,2,7}。
13、Stack<T>,栈,先入后出,Push(压栈)、Pop(出栈)。
14、Queue<T>,队列,先入先出:Enqueue(入队)、Dequeue(出队)。