基本简述
Hashtable的实例有两个参数影响其性能:初始容量和加载因子。容量是哈希表中桶的数量,初始容量就是哈希表创建时的容量。注意,哈希表的状态为open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用rehash方法的具体细节则依赖于该实现。
通常,默认加载因子(.75)在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查找某个条目的时间(在大多数Hashtable操作中,包括get和put操作,都反映了这一点)。
初始容量主要控制空间消耗与执行rehash操作所需要的时间损耗之间的平衡。如果初始容量大于Hashtable所包含的最大条目数除以加载因子,则永远不会发生rehash操作。但是,将初始容量设置太高可能会浪费空间。
如果很多条目要存储在一个Hashtable中,那么与根据需要执行自动rehashing操作来增大表的容量的做法相比,使用足够大的初始容量创建哈希表或许可以更有效地插入条目。
下面这个示例创建了一个数字的哈希表。它将数字的名称用作键:
Hashtablenumbers
=newHashtable();
numbers.add("one",1);
numbers.add("two",2);
numbers.add("three",3);
要获取一个数字,可以使用以下代码:
Integern=numbers.get("two");
if(n!=null){
System.out.println("two="+n);
}
}
在jAVA中使用put方法
如:
Hashtablenumbers
=newHashtable();numbers.put("one",1);numbers.put("two",2);numbers.put("three",3);
要检索一个数字,可以使用以下代码:
Integern=(Integer)numbers.get("two");
if(n!=null){
System.out.println("two="+n);
}
由所有类的“collection视图方法”返回的collection的iterator方法返回的迭代器都是快速失败的:在创建Iterator之后,如果从结构上对Hashtable进行修改,除非通过Iterator自身的remove方法,否则在任何时间以任何方式对其进行修改,Iterator都将抛出ConcurrentModificationException。因此,面对并发的修改,Iterator很快就会完全失败,而不冒在将来某个不确定的时间发生任意不确定行为的风险。由Hashtable的键和元素方法返回的Enumeration不是快速失败的。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误做法:迭代器的快速失败行为应该仅用于检测程序错误。
在.NETwork中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/的键值对,其中key通常可用来快速查找,同时key是区分大小写;用于存储对应于key的值。Hashtable中key/键值对均为object类型,所以Hashtable可以支持任何类型的key/键值对.
简单操作
常见功能
在哈希表中添加一个key/键值对:HashtableObject.Add(key,);
在哈希表中去除某个key/键值对:HashtableObject.Remove(key);
从哈希表中移除所有元素:HashtableObject.Clear();
判断哈希表是否包含特定键key:HashtableObject.Contains(key);
下面控制台程序将包含以上所有操作:
usingSystem;
usingSystem.Collections;//使用Hashtable时,必须引入这个命名空间
classhashtable
{
publicstaticvoidMain()
{
Hashtableht=newHashtable();//创建一个Hashtable实例
//key值唯一,value值可以重复.
ht.Add("E","e");//添加key/键值对
ht.Add("A","a");
ht.Add("C","c");
ht.Add("B","b");
strings=(string)ht["A"];
if(ht.Contains("E"))//判断哈希表是否包含特定键,其返回值为true或false
Console.WriteLine("theEkey:exist");
ht.Remove("C");//移除一个key/键值对
Console.WriteLine(ht["A"]);//此处输出a
ht.Clear();//移除所有元素
Console.WriteLine(ht["A"]);//此处将不会有任何输出
}
}
哈希表
遍历哈希表需要用到DictionaryEntryObject,代码如下:
foreach(DictionaryEntrydeinht)//ht为一个Hashtable实例
{
Console.WriteLine(de.Key);//de.Key对应于key/键值对key
Console.WriteLine(de.Value);//de.Key对应于key/键值对
}
哈希表排序
对哈希表进行排序在这里的定义是对key/键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:
ArrayListakeys=newArrayList(ht.Keys);//别忘了导入System.Collections
akeys.Sort();//按字母顺序进行排序
foreach(stringskeyinakeys)
{
Console.Write(skey+":");
Console.WriteLine(ht[skey]);//排序后输出
}