public class Hashtable
extends Dictionary<K, V>
implements Map<K, V>, Cloneable, Serializable
java.lang.Object | ||
↳ | java.util.Dictionary<K, V> | |
↳ | java.util.Hashtable<K, V> |
Known Direct Subclasses |
Known Indirect Subclasses |
这个类实现了一个哈希表,它将键映射到值。 任何非null
对象都可以用作键或值。
要成功地存储和检索哈希表中的对象,用作键的对象必须实现 hashCode
方法和 equals
方法。
Hashtable
一个实例有两个影响其性能的参数: 初始容量和负载因子 。 容量是哈希表中桶的数量, 初始容量就是哈希表创建时的容量。 请注意,散列表是打开的 :对于“散列冲突”,单个存储区存储多个条目,这些条目必须按顺序搜索。 加载因子是散列表在其容量自动增加之前被允许获得的满量程的度量。 初始容量和负载因数参数仅仅是实现的提示。 有关何时以及是否调用rehash方法的确切细节取决于实现。
通常,默认的加载因子(.75)在时间和空间成本之间提供了一个很好的折衷。 较高的值会减少空间开销,但会增加查找条目的时间成本(这反映在大多数Hashtable操作中,包括get和put )。
初始容量控制了浪费的空间和需要rehash
操作之间的权衡,这是非常耗时的。 如果初始容量大于Hashtable将包含的最大输入数量除以其负载因子,则不会发生rehash
操作。 但是,将初始容量设置得太高会浪费空间。
如果将很多条目制作为 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方法返回的迭代器是快速失败的 :如果在创建迭代器后的任何时候对结构进行修改,除了通过迭代器自己的remove方法,迭代器将抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器快速而干净地失败,而不是在将来某个未确定的时间冒着任意的,非确定性的行为风险。 Hashtable的键和元素方法返回的枚举不是快速失败的。
请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下不可能做出任何硬性保证。 失败快速迭代器在尽力而为的基础上抛出ConcurrentModificationException 。 因此,编写一个依赖于此异常的程序是正确的: 迭代器的快速失败行为应仅用于检测错误。
从Java 2平台v1.2开始,这个类被改进以实现Map
接口,使其成为Java Collections Framework的成员。 与新的集合实现不同, Hashtable
已同步。 如果不需要线程安全实现,则建议使用HashMap
来代替Hashtable
。 如果需要线程安全的高度并行实现,则建议使用ConcurrentHashMap
来代替Hashtable
。
Public constructors |
|
---|---|
Hashtable(int initialCapacity, float loadFactor) 用指定的初始容量和指定的加载因子构造一个新的空的散列表。 |
|
Hashtable(int initialCapacity) 用指定的初始容量和默认加载因子(0.75)构造一个新的空哈希表。 |
|
Hashtable() 使用默认的初始容量(11)和加载因子(0.75)构造一个新的空哈希表。 |
|
Hashtable(Map<? extends K, ? extends V> t) 使用与给定Map相同的映射构造一个新的散列表。 |
Public methods |
|
---|---|
void |
clear() 清除这个散列表,以便它不包含任何键。 |
Object |
clone() 创建此散列表的浅表副本。 |
V |
compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) 尝试计算指定键和其当前映射值的映射(如果没有当前映射, |
V |
computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) 如果指定的键尚未与值关联(或映射到 |
V |
computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) 如果指定键的值存在且非空,则尝试计算给定键和其当前映射值的新映射。 |
boolean |
contains(Object value) 测试某个键是否映射到此散列表中的指定值。 |
boolean |
containsKey(Object key) 测试指定的对象是否是此散列表中的键。 |
boolean |
containsValue(Object value) 如果此散列表将一个或多个键映射到此值,则返回true。 |
Enumeration<V> |
elements() 返回此散列表中值的枚举。 |
Set<Entry<K, V>> |
entrySet() 返回此映射中包含的映射的 |
boolean |
equals(Object o) 按照Map接口中的定义,将指定的Object与此Map进行比较以获得相等性。 |
void |
forEach(BiConsumer<? super K, ? super V> action) 对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。 |
V |
get(Object key) 返回指定键映射到的值,如果此映射不包含键映射,则返回 |
V |
getOrDefault(Object key, V defaultValue) 返回指定键映射到的值,或者如果此映射不包含键映射,则返回 |
int |
hashCode() 根据Map界面中的定义返回此Map的哈希码值。 |
boolean |
isEmpty() 测试这个哈希表是否没有将键映射到值。 |
Set<K> |
keySet() 返回此映射中包含的键的 |
Enumeration<K> |
keys() 返回此散列表中键的枚举。 |
V |
merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) 如果指定的键尚未与某个值关联或者与null关联,则将其与给定的非空值相关联。 |
V |
put(K key, V value) 将指定的 |
void |
putAll(Map<? extends K, ? extends V> t) 将指定映射中的所有映射复制到此散列表。 |
V |
putIfAbsent(K key, V value) 如果指定的键尚未与值关联(或映射到 |
boolean |
remove(Object key, Object value) 只有在指定键当前映射到指定值时,才删除该条目。 |
V |
remove(Object key) 从该散列表中删除键(及其相应的值)。 |
boolean |
replace(K key, V oldValue, V newValue) 仅当当前映射到指定值时才替换指定键的条目。 |
V |
replace(K key, V value) 仅当指定键的条目映射到某个值时才替换该条目。 |
void |
replaceAll(BiFunction<? super K, ? super V, ? extends V> function) 用对该条目调用给定函数的结果替换每个条目的值,直到处理完所有条目或者该函数抛出异常。 |
int |
size() 返回此散列表中的键的数量。 |
String |
toString() 返回一组条目,括在括号由ASCII字符 “, ”(逗号和空格)分隔开的形式这 Hashtable对象的字符串表示。 |
Collection<V> |
values() 返回此映射中包含的值的 |
Protected methods |
|
---|---|
void |
rehash() 增加散列表的容量并在内部重新组织,以便更有效地容纳和访问条目。 |
Inherited methods |
|
---|---|
From class java.util.Dictionary
|
|
From class java.lang.Object
|
|
From interface java.util.Map
|
Hashtable (int initialCapacity, float loadFactor)
用指定的初始容量和指定的加载因子构造一个新的空的散列表。
Parameters | |
---|---|
initialCapacity |
int : the initial capacity of the hashtable. |
loadFactor |
float : the load factor of the hashtable. |
Throws | |
---|---|
IllegalArgumentException |
if the initial capacity is less than zero, or if the load factor is nonpositive. |
Hashtable (int initialCapacity)
用指定的初始容量和默认加载因子(0.75)构造一个新的空哈希表。
Parameters | |
---|---|
initialCapacity |
int : the initial capacity of the hashtable. |
Throws | |
---|---|
IllegalArgumentException |
if the initial capacity is less than zero. |
Hashtable (Map<? extends K, ? extends V> t)
使用与给定Map相同的映射构造一个新的散列表。 散列表的初始容量足以容纳给定Map中的映射和默认加载因子(0.75)。
Parameters | |
---|---|
t |
Map : the map whose mappings are to be placed in this map. |
Throws | |
---|---|
NullPointerException |
if the specified map is null. |
Object clone ()
创建此散列表的浅表副本。 散列表本身的所有结构都被复制,但键和值不会被克隆。 这是一个相对昂贵的操作。
Returns | |
---|---|
Object |
a clone of the hashtable |
V compute (K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
尝试计算指定键和其当前映射值的映射(如果没有当前映射, null
)。 例如,要创建或附加一个String
味精到值映射:
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(Method
merge()
is often simpler to use for such purposes.)
如果重新映射函数返回null
,映射将被删除(如果最初不存在,则保持不存在)。 如果重映射函数本身抛出一个(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。
重新映射函数不应该在计算过程中修改此映射。
Parameters | |
---|---|
key |
K : key with which the specified value is to be associated |
remappingFunction |
BiFunction : the remapping function to compute a value |
Returns | |
---|---|
V |
the new value associated with the specified key, or null if none |
V computeIfAbsent (K key, Function<? super K, ? extends V> mappingFunction)
如果指定键尚未与值关联(或映射到 null
),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 null
。
如果映射函数返回null
,则不记录映射。 如果映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且不记录映射。 最常见的用法是构造一个新的对象作为初始映射值或记忆结果,如下所示:
map.computeIfAbsent(key, k -> new Value(f(k)));
或者实现一个多值映射 Map<K,Collection<V>>
,每个键支持多个值:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
计算过程中映射函数不应修改此映射。
Parameters | |
---|---|
key |
K : key with which the specified value is to be associated |
mappingFunction |
Function : the mapping function to compute a value |
Returns | |
---|---|
V |
the current (existing or computed) value associated with the specified key, or null if the computed value is null |
V computeIfPresent (K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
如果指定键的值存在且非空,则尝试计算给定键和其当前映射值的新映射。
如果重映射函数返回null
,则映射被移除。 如果重映射函数本身抛出一个(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。
重新映射函数不应该在计算过程中修改此映射。
Parameters | |
---|---|
key |
K : key with which the specified value is to be associated |
remappingFunction |
BiFunction : the remapping function to compute a value |
Returns | |
---|---|
V |
the new value associated with the specified key, or null if none |
boolean contains (Object value)
测试某个键是否映射到此散列表中的指定值。 该操作比containsKey
方法更昂贵。
请注意,此方法在功能上与 containsValue
(它是集合框架中的 Map
接口的一部分) Map
。
Parameters | |
---|---|
value |
Object : a value to search for |
Returns | |
---|---|
boolean |
true if and only if some key maps to the value argument in this hashtable as determined by the equals method; false otherwise. |
Throws | |
---|---|
NullPointerException |
if the value is null |
boolean containsKey (Object key)
测试指定的对象是否是此散列表中的键。
Parameters | |
---|---|
key |
Object : possible key |
Returns | |
---|---|
boolean |
true if and only if the specified object is a key in this hashtable, as determined by the equals method; false otherwise. |
Throws | |
---|---|
NullPointerException |
if the key is null |
也可以看看:
boolean containsValue (Object value)
如果此散列表将一个或多个键映射到此值,则返回true。
请注意,此方法在功能上与 contains
(它早于 Map
接口)相同。
Parameters | |
---|---|
value |
Object : value whose presence in this hashtable is to be tested |
Returns | |
---|---|
boolean |
true if this map maps one or more keys to the specified value |
Throws | |
---|---|
NullPointerException |
if the value is null |
Enumeration<V> elements ()
返回此散列表中值的枚举。 在返回的对象上使用Enumeration方法来顺序获取元素。
Returns | |
---|---|
Enumeration<V> |
an enumeration of the values in this hashtable. |
也可以看看:
Set<Entry<K, V>> entrySet ()
返回此映射中映射的映射的Set
视图。 该集合由地图支持,因此对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改了映射(除了通过迭代器自己的remove操作或通过对迭代器返回的映射条目执行setValue操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll clear和操作。 它不支持add或addAll操作。
Returns | |
---|---|
Set<Entry<K, V>> |
a set view of the mappings contained in this map |
boolean equals (Object o)
按照Map接口中的定义,将指定的Object与此Map进行比较以获得相等性。
Parameters | |
---|---|
o |
Object : object to be compared for equality with this hashtable |
Returns | |
---|---|
boolean |
true if the specified Object is equal to this Map |
也可以看看:
void forEach (BiConsumer<? super K, ? super V> action)
对此映射中的每个条目执行给定操作,直到处理完所有条目或操作抛出异常为止。 除非实现类另有规定,否则按照条目集迭代的顺序执行操作(如果指定了迭代顺序)。操作抛出的异常会中继给调用者。
Parameters | |
---|---|
action |
BiConsumer : The action to be performed for each entry |
V get (Object key)
返回指定键映射到的值,如果此映射不包含键映射,则返回 null
。
更正式地说,如果该映射包含从键k
到值v
的映射,例如(key.equals(k))
,则该方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)
Parameters | |
---|---|
key |
Object : the key whose associated value is to be returned |
Returns | |
---|---|
V |
the value to which the specified key is mapped, or null if this map contains no mapping for the key |
Throws | |
---|---|
NullPointerException |
if the specified key is null |
也可以看看:
V getOrDefault (Object key, V defaultValue)
返回指定键映射到的值 defaultValue
如果此映射不包含键映射,则返回 defaultValue
。
Parameters | |
---|---|
key |
Object : the key whose associated value is to be returned |
defaultValue |
V : the default mapping of the key |
Returns | |
---|---|
V |
the value to which the specified key is mapped, or defaultValue if this map contains no mapping for the key |
int hashCode ()
根据Map界面中的定义返回此Map的哈希码值。
Returns | |
---|---|
int |
a hash code value for this object. |
也可以看看:
boolean isEmpty ()
测试这个哈希表是否没有将键映射到值。
Returns | |
---|---|
boolean |
true if this hashtable maps no keys to values; false otherwise. |
Set<K> keySet ()
返回此映射中包含的键的Set
视图。 该集合由地图支持,因此对地图的更改反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll,和clear操作。 它不支持add或addAll操作。
Returns | |
---|---|
Set<K> |
a set view of the keys contained in this map |
Enumeration<K> keys ()
返回此散列表中键的枚举。
Returns | |
---|---|
Enumeration<K> |
an enumeration of the keys in this hashtable. |
也可以看看:
V merge (K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
如果指定的键尚未与某个值关联或者与null关联,则将其与给定的非空值相关联。 否则,用给定的重映射函数的结果替换关联的值,或者如果结果为null
,则将其删除。 组合键的多个映射值时,此方法可能会有用。 例如,要创建或附加一个String msg
到值映射:
map.merge(key, msg, String::concat)
如果重映射函数返回null
,则映射将被删除。 如果重映射函数本身抛出一个(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。
重新映射函数不应该在计算过程中修改此映射。
Parameters | |
---|---|
key |
K : key with which the resulting value is to be associated |
value |
V : the non-null value to be merged with the existing value associated with the key or, if no existing value or a null value is associated with the key, to be associated with the key |
remappingFunction |
BiFunction : the remapping function to recompute a value if present |
Returns | |
---|---|
V |
the new value associated with the specified key, or null if no value is associated with the key |
V put (K key, V value)
将指定的key
映射到此散列表中指定的value
。 关键和价值都不是null
。
可以通过使用与原始密钥相同的密钥调用 get
方法来检索该值。
Parameters | |
---|---|
key |
K : the hashtable key |
value |
V : the value |
Returns | |
---|---|
V |
the previous value of the specified key in this hashtable, or null if it did not have one |
Throws | |
---|---|
NullPointerException |
if the key or value is null |
也可以看看:
void putAll (Map<? extends K, ? extends V> t)
将指定映射中的所有映射复制到此散列表。 这些映射将替换此散列表对当前指定映射中的任何键的任何映射。
Parameters | |
---|---|
t |
Map : mappings to be stored in this map |
Throws | |
---|---|
NullPointerException |
if the specified map is null |
V putIfAbsent (K key, V value)
如果指定的键尚未与值关联(或映射到 null
), null
其与给定值相关联并返回 null
,否则返回当前值。
Parameters | |
---|---|
key |
K : key with which the specified value is to be associated |
value |
V : value to be associated with the specified key |
Returns | |
---|---|
V |
the previous value associated with the specified key, or null if there was no mapping for the key. (A null return can also indicate that the map previously associated null with the key, if the implementation supports null values.) |
boolean remove (Object key, Object value)
只有在指定键当前映射到指定值时,才删除该条目。
Parameters | |
---|---|
key |
Object : key with which the specified value is associated |
value |
Object : value expected to be associated with the specified key |
Returns | |
---|---|
boolean |
true if the value was removed |
V remove (Object key)
从该散列表中删除键(及其相应的值)。 如果密钥不在散列表中,此方法不执行任何操作。
Parameters | |
---|---|
key |
Object : the key that needs to be removed |
Returns | |
---|---|
V |
the value to which the key had been mapped in this hashtable, or null if the key did not have a mapping |
Throws | |
---|---|
NullPointerException |
if the key is null |
boolean replace (K key, V oldValue, V newValue)
仅当当前映射到指定值时才替换指定键的条目。
Parameters | |
---|---|
key |
K : key with which the specified value is associated |
oldValue |
V : value expected to be associated with the specified key |
newValue |
V : value to be associated with the specified key |
Returns | |
---|---|
boolean |
true if the value was replaced |
V replace (K key, V value)
仅当指定键的条目映射到某个值时才替换该条目。
Parameters | |
---|---|
key |
K : key with which the specified value is associated |
value |
V : value to be associated with the specified key |
Returns | |
---|---|
V |
the previous value associated with the specified key, or null if there was no mapping for the key. (A null return can also indicate that the map previously associated null with the key, if the implementation supports null values.) |
void replaceAll (BiFunction<? super K, ? super V, ? extends V> function)
用对该条目调用给定函数的结果替换每个条目的值,直到处理完所有条目或者该函数抛出异常。 函数抛出的异常会传递给调用者。
Parameters | |
---|---|
function |
BiFunction : the function to apply to each entry |
int size ()
返回此散列表中的键的数量。
Returns | |
---|---|
int |
the number of keys in this hashtable. |
String toString ()
以一组条目形式返回此Hashtable对象的字符串表示形式,并用大括号括起来,并用ASCII字符“ , ”(逗号和空格)分隔。 每个条目呈现为密钥,等号=和关联元素,其中使用toString方法将密钥和元素转换为字符串。
Returns | |
---|---|
String |
a string representation of this hashtable |
Collection<V> values ()
返回此映射中包含的值的Collection
视图。 该集合由地图支持,因此地图的更改会反映在集合中,反之亦然。 如果在对集合进行迭代的过程中修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll clear和操作。 它不支持add或addAll操作。
Returns | |
---|---|
Collection<V> |
a collection view of the values contained in this map |
void rehash ()
增加散列表的容量并在内部重新组织,以便更有效地容纳和访问条目。 当散列表中的键数超过散列表的容量和加载因子时,将自动调用此方法。