- 类型参数:
K
- 此map维护的键类型V
- 映射值的类型
- 所有已实现的接口:
Serializable
,Cloneable
,Map<K,
V>
- 已知子类:
Properties
,UIDefaults
null
对象都可以用作键或值。
要成功地从哈希表中存储和检索对象,用作键的对象必须实现 hashCode
方法和 equals
方法。
Hashtable
的实例有两个影响其性能的参数:初始容量和负载系数.这capacity是的数量水桶在哈希表中,并且初始容量只是创建哈希表时的容量。注意哈希表是打开:在“哈希冲突”的情况下,单个桶存储多个条目,必须顺序搜索。这负载系数是哈希表在其容量自动增加之前允许达到多满的量度。初始容量和负载因子参数只是对实现的提示。关于何时以及是否调用 rehash 方法的确切细节取决于实现。
通常,默认加载因子 (.75) 在时间和空间成本之间提供了良好的权衡。较高的值会减少空间开销,但会增加查找条目的时间成本(这反映在大多数 Hashtable
操作中,包括 get
和 put
)。
初始容量控制着空间浪费与耗时的 rehash
操作需求之间的权衡。没有rehash
操作会曾经如果初始容量大于 Hashtable
将包含的最大条目数除以其负载因子,则会发生这种情况。但是,将初始容量设置得太高会浪费空间。
如果要将许多条目放入 Hashtable
中,创建具有足够大容量的条目可能比让它根据需要执行自动重新散列以增加表更有效地插入条目。
这个示例创建了一个数字哈希表。它使用数字的名称作为键:
Hashtable<String, Integer> numbers
= new Hashtable<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
要检索号码,请使用以下代码:
Integer n = numbers.get("two");
if (n != null) {
System.out.println("two = " + n);
}
由该类的所有“集合视图方法”返回的集合的iterator
方法返回的迭代器是fail-fast:如果在创建迭代器后的任何时间以任何方式修改哈希表的结构,除了通过迭代器自己的remove
方法,迭代器将抛出一个 ConcurrentModificationException
。因此,面对并发修改,迭代器会快速干净地失败,而不是冒着在未来不确定的时间出现任意的、不确定的行为的风险。 Hashtable 的 keys
和 elements
方法返回的 Enumerations 是 not fail-fast;如果 Hashtable 在创建枚举后的任何时候在结构上被修改,那么枚举的结果是不确定的。
请注意,无法保证迭代器的快速失败行为,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException
。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。
从 Java 2 平台 v1.2 开始,这个类被改造以实现 Map
接口,使其成为 Java 集合框架 的成员。与新的集合实现不同,Hashtable
是同步的。如果不需要线程安全实现,建议使用 HashMap
代替 Hashtable
。如果需要线程安全的高并发实现,那么建议使用ConcurrentHashMap
代替Hashtable
。
- 自从:
- 1.0
- 参见:
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述void
clear()
清除此哈希表,使其不包含键。clone()
创建此哈希表的浅表副本。尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null
)。computeIfAbsent
(K key, Function<? super K, ? extends V> mappingFunction) 如果指定的键尚未与值关联(或映射到null
),则尝试使用给定的映射函数计算其值并将其输入此map,除非null
。computeIfPresent
(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) 如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。boolean
测试某些键是否映射到此哈希表中的指定值。boolean
containsKey
(Object key) 测试指定对象是否是此哈希表中的键。boolean
containsValue
(Object value) 如果此哈希表将一个或多个键映射到此值,则返回 true。elements()
返回此哈希表中值的枚举。entrySet()
返回此map中包含的映射的Set
视图。boolean
根据 Map 接口中的定义,比较指定的 Object 与此 Map 是否相等。返回指定键映射到的值,如果此map不包含键的映射,则返回null
。int
hashCode()
根据 Map 接口中的定义返回此 Map 的哈希码值。boolean
isEmpty()
测试此哈希表是否没有将键映射到值。keys()
返回此哈希表中键的枚举。keySet()
返回此map中包含的键的Set
视图。如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。将指定的key
映射到此哈希表中指定的value
。void
将指定map中的所有值复制到此哈希表。protected void
rehash()
增加哈希表的容量并在内部重组该哈希表,以便更有效地容纳和访问其条目。从此哈希表中删除键(及其对应的值)。int
size()
返回此哈希表中的键数。toString()
以一组条目的形式返回此Hashtable
对象的字符串表示形式,括在大括号中并由 ASCII 字符“,
”(逗号和空格)分隔。values()
返回此map中包含的值的Collection
视图。在接口 java.util.Map 中声明的方法
forEach, getOrDefault, putIfAbsent, remove, replace, replace, replaceAll
-
构造方法详细信息
-
Hashtable
public Hashtable(int initialCapacity, float loadFactor) 使用指定的初始容量和指定的加载因子构造一个新的空哈希表。- 参数:
initialCapacity
- 哈希表的初始容量。loadFactor
- 哈希表的负载因子。- 抛出:
IllegalArgumentException
- 如果初始容量小于零,或者负载因子为非正数。
-
Hashtable
public Hashtable(int initialCapacity) 使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空哈希表。- 参数:
initialCapacity
- 哈希表的初始容量。- 抛出:
IllegalArgumentException
- 如果初始容量小于零。
-
Hashtable
public Hashtable()使用默认初始容量 (11) 和加载因子 (0.75) 构造一个新的空哈希表。 -
Hashtable
使用与给定 Map 相同的映射构造一个新的哈希表。创建的哈希表具有足以容纳给定 Map 中的映射的初始容量和默认加载因子 (0.75)。- 参数:
t
- 其映射要放置在此map中的map。- 抛出:
NullPointerException
- 如果指定的map为空。- 自从:
- 1.2
-
-
方法详情
-
size
public int size()返回此哈希表中的键数。 -
isEmpty
public boolean isEmpty()测试此哈希表是否没有将键映射到值。 -
keys
返回此哈希表中键的枚举。在返回的对象上使用枚举方法按顺序获取键。如果在对键进行枚举时对哈希表进行了结构修改,则枚举的结果是未定义的。- 指定者:
keys
在类Dictionary<K,
中V> - 返回:
- 此哈希表中键的枚举。
- 参见:
-
elements
返回此哈希表中值的枚举。在返回的对象上使用 Enumeration 方法按顺序获取元素。如果在枚举值时对哈希表进行了结构修改,则枚举的结果是未定义的。- 指定者:
elements
在类Dictionary<K,
中V> - 返回:
- 此哈希表中值的枚举。
- 参见:
-
contains
测试某些键是否映射到此哈希表中的指定值。此操作比containsKey
方法更昂贵。请注意,此方法在功能上与
containsValue
相同(它是集合框架中Map
接口的一部分)。- 参数:
value
- 要搜索的值- 返回:
true
当且仅当某些键映射到由equals
方法确定的此哈希表中的value
参数时;false
否则。- 抛出:
NullPointerException
- 如果值为null
-
containsValue
- 指定者:
containsValue
在接口Map<K,
中V> - 参数:
value
- 要测试其在此哈希表中是否存在的值- 返回:
true
如果此map将一个或多个键映射到指定值- 抛出:
NullPointerException
- 如果值为null
- 自从:
- 1.2
-
containsKey
测试指定对象是否是此哈希表中的键。- 指定者:
containsKey
在接口Map<K,
中V> - 参数:
key
- 可能的关键- 返回:
true
当且仅当指定对象是此哈希表中的键时,由equals
方法确定;false
否则。- 抛出:
NullPointerException
- 如果密钥是null
- 参见:
-
get
返回指定键映射到的值,如果此map不包含键的映射,则返回null
。更正式地说,如果此map包含从键
k
到值v
的映射,使得(key.equals(k))
,则此方法返回v
;否则返回null
。 (最多可以有一个这样的映射。)- 指定者:
get
在接口Map<K,
中V> - 指定者:
get
在类Dictionary<K,
中V> - 参数:
key
- 要返回其关联值的键- 返回:
-
指定键映射到的值,如果此map不包含键的映射,则返回
null
- 抛出:
NullPointerException
- 如果指定的键为空- 参见:
-
rehash
protected void rehash()增加哈希表的容量并在内部重组该哈希表,以便更有效地容纳和访问其条目。当哈希表中的键数超过此哈希表的容量和负载因子时,将自动调用此方法。 -
put
将指定的key
映射到此哈希表中指定的value
。键和值都不能是null
。可以通过使用与原始键相同的键调用
get
方法来检索该值。- 指定者:
put
在接口Map<K,
中V> - 指定者:
put
在类Dictionary<K,
中V> - 参数:
key
- 哈希表键value
- 值- 返回:
-
此哈希表中指定键的先前值,如果没有,则返回
null
- 抛出:
NullPointerException
- 如果键或值是null
- 参见:
-
remove
从此哈希表中删除键(及其对应的值)。如果键不在哈希表中,则此方法不执行任何操作。- 指定者:
remove
在接口Map<K,
中V> - 指定者:
remove
在类Dictionary<K,
中V> - 参数:
key
- 需要删除的密钥- 返回:
-
键在此哈希表中映射到的值,如果键没有映射,则为
null
- 抛出:
NullPointerException
- 如果密钥是null
-
putAll
将指定map中的所有映射复制到此哈希表。这些映射将替换此哈希表对指定map中当前任何键的任何映射。- 指定者:
putAll
在接口Map<K,
中V> - 参数:
t
- 要存储在此map中的映射- 抛出:
NullPointerException
- 如果指定的map为空- 自从:
- 1.2
-
clear
public void clear()清除此哈希表,使其不包含键。 -
clone
创建此哈希表的浅表副本。哈希表本身的所有结构都被复制,但键和值没有被克隆。这是一个相对昂贵的操作。 -
toString
以一组条目的形式返回此Hashtable
对象的字符串表示形式,括在大括号中并由 ASCII 字符“,
”(逗号和空格)分隔。每个条目都呈现为键、等号=
和关联的元素,其中toString
方法用于将键和元素转换为字符串。 -
keySet
返回此map中包含的键的Set
视图。该集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改map(除了通过迭代器自己的remove
操作),迭代的结果是不确定的。该集合支持元素删除,即通过Iterator.remove
、Set.remove
、removeAll
、retainAll
和clear
操作从map中删除相应的映射。它不支持add
或addAll
操作。 -
entrySet
返回此map中包含的映射的Set
视图。该集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时映射被修改(除了通过迭代器自己的remove
操作,或通过迭代器返回的映射条目上的setValue
操作),迭代的结果是未定义的。该集合支持元素移除,即通过Iterator.remove
、Set.remove
、removeAll
、retainAll
和clear
操作从map中移除相应的映射。它不支持add
或addAll
操作。 -
values
返回此map中包含的值的Collection
视图。集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改map(除了通过迭代器自己的remove
操作),迭代的结果是不确定的。该集合支持元素删除,即通过Iterator.remove
、Collection.remove
、removeAll
、retainAll
和clear
操作从map中删除相应的映射。它不支持add
或addAll
操作。 -
equals
根据 Map 接口中的定义,比较指定的 Object 与此 Map 是否相等。 -
hashCode
public int hashCode()根据 Map 接口中的定义返回此 Map 的哈希码值。 -
computeIfAbsent
如果指定的键尚未与值关联(或映射到null
),则尝试使用给定的映射函数计算其值并将其输入此map,除非null
。如果map函数返回
null
,则不记录任何映射。如果map函数本身抛出(未经检查的)异常,则重新抛出异常,并且不记录任何映射。最常见的用法是构造一个新对象作为初始映射值或记忆结果,如下所示:map.computeIfAbsent(key, k -> new Value(f(k)));
或者实现多值映射
Map<K,Collection<V>>
,支持每个键多个值:map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
映射函数不应在计算期间修改此map。
如果map函数在计算期间修改了此map,则此方法将尽最大努力抛出
ConcurrentModificationException
。- 指定者:
computeIfAbsent
在接口Map<K,
中V> - 参数:
key
- 与指定值关联的键mappingFunction
- 计算值的映射函数- 返回:
- 与指定键关联的当前(现有或计算)值,如果计算值为 null,则为 null
- 抛出:
ConcurrentModificationException
- 如果检测到映射函数修改了这个map
-
computeIfPresent
如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。如果重映射函数返回
null
,则删除映射。如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。重新映射函数不应在计算期间修改此map。
如果重新映射函数在计算期间修改了此map,则此方法将尽最大努力抛出
ConcurrentModificationException
。- 指定者:
computeIfPresent
在接口Map<K,
中V> - 参数:
key
- 与指定值关联的键remappingFunction
- 计算值的重映射函数- 返回:
- 与指定键关联的新值,如果没有则为 null
- 抛出:
ConcurrentModificationException
- 如果检测到重映射函数修改了这个map
-
compute
尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null
)。例如,要创建或将String
消息附加到值映射:map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
merge()
通常更易于用于此类目的。)如果重新映射函数返回
null
,则映射将被删除(或者如果最初不存在则保持不存在)。如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。重新映射函数不应在计算期间修改此map。
如果重新映射函数在计算期间修改了此map,则此方法将尽最大努力抛出
ConcurrentModificationException
。- 指定者:
compute
在接口Map<K,
中V> - 参数:
key
- 与指定值关联的键remappingFunction
- 计算值的重映射函数- 返回:
- 与指定键关联的新值,如果没有则为 null
- 抛出:
ConcurrentModificationException
- 如果检测到重映射函数修改了这个map
-
merge
如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。否则,将关联值替换为给定重映射函数的结果,或者如果结果为null
则移除。当组合一个键的多个映射值时,此方法可能有用。例如,要创建String msg
或将其附加到值映射:map.merge(key, msg, String::concat)
如果重映射函数返回
null
,则删除映射。如果重映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。重新映射函数不应在计算期间修改此map。
如果重新映射函数在计算期间修改了此map,则此方法将尽最大努力抛出
ConcurrentModificationException
。- 指定者:
merge
在接口Map<K,
中V> - 参数:
key
- 与结果值关联的键value
- 要与键关联的现有值合并的非空值,或者,如果没有现有值或空值与键关联,则与键关联remappingFunction
- 重新映射函数以重新计算值(如果存在)- 返回:
- 与指定键关联的新值,如果没有值与该键关联,则返回 null
- 抛出:
ConcurrentModificationException
- 如果检测到重映射函数修改了这个map
-