c#中哈希表的使用(Hashtable)
2010-03-04 09:57
337 查看
Hashtable 类
表示键/值对的集合,这些键/值对根据键的哈希代码
进行组织。
每个元素都是一个存储在 DictionaryEntry
对象中的键/值对。键不能为 null
Nothing
nullptr
null 引用(在 Visual
Basic 中为 Nothing
)
,但值可以。
哈希函数是基于键返回数值哈希代码的算法。键是正被存储的对象的某一属性的值。哈希函数必须始终为相同的键返回相同的哈希代码。一个哈希函数能够为
两个不同的键生成相同的哈希代码,但从哈希表检索元素时,为每一唯一键生成唯一哈希代码的哈希函数将令性能更佳。
在C# Hashtable 中用作元素的每一对象必须能够使用 GetHashCode
方法的实现为其自身生成哈希代码。但是,还可以通过使用接受 IHashCodeProvider 实现作为参数之一的 Hashtable
构造函数,为 Hashtable 中的所有元素指定一个哈希函数。
Hashtable
中的每个键对象必须提供其自己的哈希函数,可通过调用 GetHash
访问该函数。
被 Hashtable
用作键的对象
要重写
Object.
GetHashCode
方法(或 IHashCodeProvider
接口)和 Object.
Equals
方法(或 IComparer
接口)。方法和接口的实现必须以相同的方式处理大小写;否则,Hashtable
的行为可能不正确。例如,创建 Hashtable
时,您必须配合使用 CaseInsensitiveHashCodeProvider
类(或任何不区分大小写的 IHashCodeProvider
实现)和 CaseInsensitiveComparer
类(或任何不区分大小写的 IComparer
实现)。
此外,如果该键存在于 Hashtable
中,那么当使用相同参数调用这些方法时,这些方法必须生成相同的结果。还有一种方式是使用具有 IEqualityComparer
参数的 Hashtable
构造函数。如果键相等性只是引用相等性,则 Object.
GetHashCode
和 Object.
Equals
的继承实现将满足需要。
只要键对象用作 Hashtable
中的键,它们就必须是永远不变的。
当把某个元素添加
到 Hashtable
时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次
数。
Hashtable
的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子 1.0
通常提供速度和大小之间的最佳平衡。当创建 Hashtable
时,也可以指定其他加载因子。
当向 Hashtable
添加元素时,Hashtable
的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable
中存储桶的数目自动增加到大于当前 Hashtable
存储桶数两倍的最小质数。
Hashtable
的容量是 Hashtable
可拥有的元素数。随着向 Hashtable
中添加元素,容量通过重新分配按需自动增加。
Hashtable
是线程安全的,可由多个读取器线程和一个写入线程使用。多线程使用时,如果只有一个线程执行写入(更新)操作,则它是线程安全的,从而允许进行无锁定的读
取(若编写器序列化为 Hashtable
)。若要支持多个编写器,如果没有任何线程在读取 Hashtable
对象,则对 Hashtable
的所有操作都必须通过 Synchronized
方法返回的包装完成。
从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。即使一个集合已进行同步,其他线程仍可以修改该集合,
这将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
表示键/值对的集合,这些键/值对根据键的哈希代码
进行组织。
每个元素都是一个存储在 DictionaryEntry
对象中的键/值对。键不能为 null
Nothing
nullptr
null 引用(在 Visual
Basic 中为 Nothing
)
,但值可以。
哈希函数是基于键返回数值哈希代码的算法。键是正被存储的对象的某一属性的值。哈希函数必须始终为相同的键返回相同的哈希代码。一个哈希函数能够为
两个不同的键生成相同的哈希代码,但从哈希表检索元素时,为每一唯一键生成唯一哈希代码的哈希函数将令性能更佳。
在C# Hashtable 中用作元素的每一对象必须能够使用 GetHashCode
方法的实现为其自身生成哈希代码。但是,还可以通过使用接受 IHashCodeProvider 实现作为参数之一的 Hashtable
构造函数,为 Hashtable 中的所有元素指定一个哈希函数。
Hashtable
中的每个键对象必须提供其自己的哈希函数,可通过调用 GetHash
访问该函数。
被 Hashtable
用作键的对象
要重写
Object.
GetHashCode
方法(或 IHashCodeProvider
接口)和 Object.
Equals
方法(或 IComparer
接口)。方法和接口的实现必须以相同的方式处理大小写;否则,Hashtable
的行为可能不正确。例如,创建 Hashtable
时,您必须配合使用 CaseInsensitiveHashCodeProvider
类(或任何不区分大小写的 IHashCodeProvider
实现)和 CaseInsensitiveComparer
类(或任何不区分大小写的 IComparer
实现)。
此外,如果该键存在于 Hashtable
中,那么当使用相同参数调用这些方法时,这些方法必须生成相同的结果。还有一种方式是使用具有 IEqualityComparer
参数的 Hashtable
构造函数。如果键相等性只是引用相等性,则 Object.
GetHashCode
和 Object.
Equals
的继承实现将满足需要。
只要键对象用作 Hashtable
中的键,它们就必须是永远不变的。
当把某个元素添加
到 Hashtable
时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次
数。
Hashtable
的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子 1.0
通常提供速度和大小之间的最佳平衡。当创建 Hashtable
时,也可以指定其他加载因子。
当向 Hashtable
添加元素时,Hashtable
的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable
中存储桶的数目自动增加到大于当前 Hashtable
存储桶数两倍的最小质数。
Hashtable
的容量是 Hashtable
可拥有的元素数。随着向 Hashtable
中添加元素,容量通过重新分配按需自动增加。
Hashtable
是线程安全的,可由多个读取器线程和一个写入线程使用。多线程使用时,如果只有一个线程执行写入(更新)操作,则它是线程安全的,从而允许进行无锁定的读
取(若编写器序列化为 Hashtable
)。若要支持多个编写器,如果没有任何线程在读取 Hashtable
对象,则对 Hashtable
的所有操作都必须通过 Synchronized
方法返回的包装完成。
从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。即使一个集合已进行同步,其他线程仍可以修改该集合,
这将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
相关文章推荐
- C#中使用哈希表Hashtable
- 哈希表 Hashtable 和 动态数组 ArrayList 的使用 (c#)
- C#使用foreach遍历哈希表(hashtable)的方法
- 如何使用C#的Hashtable[哈希表]
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(3):
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(1):
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(2):
- C# 哈希表(Hashtable)
- 在C#中应用哈希表(Hashtable)[网淘]
- (转)C# (线程安全的哈希表)Hashtable Synchronized vs SyncRoot
- c#常用集合类使用练习(队列Queue、栈Stack、哈希表Hashtable和动态数组ArrayList)(4):
- 在C#中应用哈希表(Hashtable)
- 在c#中应用哈希表(hashtable) _c#应用
- 在C#中应用哈希表(Hashtable)
- C#中集合ArrayList与Hashtable的使用
- 在C#中应用哈希表(Hashtable)[转摘]
- c#中哈希表的使用(Dictionary)
- 在C#中应用哈希表(Hashtable)
- C#中Hashtable的使用
- c#基础知识---集合之哈希表(Hashtable)