- java.lang.Object
-
- java.util.Dictionary<K,V>
-
- java.util.Hashtable<K,V>
-
- 参数类型
-
K
- 由该地图维护的键的类型 -
V
- 映射值的类型
- All Implemented Interfaces:
-
Serializable
,Cloneable
,Map<K,V>
- 已知直接子类:
-
Properties
,UIDefaults
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
该类实现了一个哈希表,它将键映射到值。 任何非null
对象都可以用作键值或值。要从哈希表成功存储和检索对象,用作键的对象必须实现
hashCode
方法和equals
方法。Hashtable
一个实例有两个参数影响其性能: 初始容量和负载因子 。 容量是哈希表中的桶数, 初始容量只是创建哈希表时的容量。 请注意,哈希表是打开的 :在“哈希冲突”的情况下,单个存储桶存储多个条目,必须依次搜索。 负载因子是在容量自动增加之前允许哈希表得到满足的度量。 初始容量和负载因子参数仅仅是实现的暗示。 关于何时以及是否调用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 :如果Hashtable在迭代器创建之后的任何时间被结构地修改,除了通过迭代器自己的remove
方法,迭代器会抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。 Hashtable的keys
和elements
方法返回的枚举不是故障快速的; 如果在创建枚举后的任何时候Hashtable被结构上修改,那么枚举的结果是未定义的。请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器
ConcurrentModificationException
抛出ConcurrentModificationException
。 因此,编写依赖于此异常的程序的正确性将是错误的: 迭代器的故障快速行为应仅用于检测错误。从Java 2平台v1.2开始,该类进行了改进,实现了
Map
接口,使其成为Java Collections Framework的成员。 与新的集合实现不同,Hashtable
被同步。 如果不需要线程安全的实现,建议使用HashMap
代替Hashtable
。 如果需要线程安全高度并发的实现,那么建议使用ConcurrentHashMap
代替Hashtable
。- 从以下版本开始:
- 1.0
- 另请参见:
-
Object.equals(java.lang.Object)
,Object.hashCode()
,rehash()
,Collection
,Map
,HashMap
,TreeMap
, Serialized Form
-
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 void
clear()
清除此散列表,使其不包含键。Object
clone()
创建这个散列表的浅拷贝。V
compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
尝试计算指定密钥及其当前映射值的映射(如果没有当前映射,则null
)。V
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
如果指定的键尚未与值相关联(或映射到null
),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非是null
。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<Map.Entry<K,V>>
entrySet()
返回此地图中包含的映射的Set
视图。boolean
equals(Object o)
根据Map界面中的定义,将指定的对象与此Map进行比较以相等。void
forEach(BiConsumer<? super K,? super V> action)
对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。V
get(Object key)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null
。V
getOrDefault(Object key, V defaultValue)
返回指定键映射到的值,如果此映射不包含该键的映射,则返回defaultValue
。int
hashCode()
按照Map界面中的定义返回此Map的哈希码值。boolean
isEmpty()
测试这个哈希表是否将值映射到值。Enumeration<K>
keys()
返回此散列表中键的枚举。Set<K>
keySet()
返回此地图中包含的键的Set
视图。V
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。V
put(K key, V value)
将指定的key
映射到此散列表中指定的value
。void
putAll(Map<? extends K,? extends V> t)
将所有从指定地图的映射复制到此散列表。V
putIfAbsent(K key, V value)
如果指定的键尚未与值相关联(或映射到null
)将其与给定值相关联并返回null
,否则返回当前值。protected void
rehash()
增加这个散列表的内部重组能力,从而更有效地适应和访问其条目。V
remove(Object key)
从此散列表中删除键(及其对应的值)。boolean
remove(Object key, Object value)
仅当指定的密钥当前映射到指定的值时删除该条目。V
replace(K key, V value)
只有当目标映射到某个值时,才能替换指定键的条目。boolean
replace(K key, V oldValue, V newValue)
仅当当前映射到指定的值时,才能替换指定键的条目。void
replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。int
size()
返回此哈希表中的键数。String
toString()
以一组条目的形式返回此Hashtable
对象的字符串表示形式,其括在大括号中,并以ASCII字符“,
”(逗号和空格)分隔。Collection<V>
values()
返回此地图中包含的值的Collection
视图。
-
-
-
构造方法详细信息
-
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
public Hashtable(Map<? extends K,? extends V> t)
构造一个与给定地图相同的映射的新哈希表。 创建哈希表的初始容量足以保持给定地图中的映射和默认负载因子(0.75)。- 参数
-
t
- 其映射将放置在此映射中的映射。 - 异常
-
NullPointerException
- 如果指定的地图为空。 - 从以下版本开始:
- 1.2
-
-
方法详细信息
-
size
public int size()
返回此哈希表中的键数。
-
isEmpty
public boolean isEmpty()
测试这个哈希表是否将值映射到值。
-
keys
public Enumeration<K> keys()
返回此散列表中键的枚举。 对返回的对象使用枚举方法按顺序获取键。 如果哈希表在结构上被修改,同时枚举了键,则枚举的结果是未定义的。- Specified by:
-
keys
在Dictionary<K,V>
- 结果
- 这个哈希表中的键的枚举。
- 另请参见:
-
Enumeration
,elements()
,keySet()
,Map
-
elements
public Enumeration<V> elements()
返回此散列表中值的枚举。 对返回的对象使用枚举方法来顺序获取元素。 如果哈希表在结构上被修改,同时枚举了值,则枚举的结果是未定义的。- Specified by:
-
elements
在Dictionary<K,V>
- 结果
- 列出这个散列表中的值。
- 另请参见:
-
Enumeration
,keys()
,values()
,Map
-
contains
public boolean contains(Object value)
- 参数
-
value
- 要搜索的值 - 结果
-
true
当且仅当某些键映射到equals
方法确定的散列表中的value
参数时;false
否则。 - 异常
-
NullPointerException
- 如果值为null
-
containsValue
public boolean containsValue(Object value)
- Specified by:
-
containsValue
在接口Map<K,V>
- 参数
-
value
- 要在此散列表中存在的值要进行测试 - 结果
-
true
如果此映射将一个或多个键映射到指定的值 - 异常
-
NullPointerException
- 如果值是null
- 从以下版本开始:
- 1.2
-
containsKey
public boolean containsKey(Object key)
测试指定的对象是否在此哈希表中的键。- Specified by:
-
containsKey
在接口Map<K,V>
- 参数
-
key
- 可能的钥匙 - 结果
-
true
当且仅当指定的对象是这个哈希表中的键,由equals
方法确定;false
否则。 - 异常
-
NullPointerException
- 如果键是null
- 另请参见:
-
contains(Object)
-
get
public V get(Object key)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null
。更正式地,如果该映射包含从密钥
k
到值v
的映射,使得(key.equals(k))
,则该方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)- Specified by:
-
get
在接口Map<K,V>
- Specified by:
-
get
在Dictionary<K,V>
- 参数
-
key
- 要返回其关联值的键 - 结果
-
映射指定键的值,如果此映射不包含该键的映射,
null
- 异常
-
NullPointerException
- 如果指定的键为空 - 另请参见:
-
put(Object, Object)
-
rehash
protected void rehash()
增加这个散列表的内部重组能力,从而更有效地适应和访问其条目。 当哈希表中的键数超过此散列表的容量和载入系数时,将自动调用此方法。
-
put
public V put(K key, V value)
将指定的key
映射到此散列表中指定的value
。 钥匙和价值都不能是null
。可以通过使用等于原始密钥的密钥调用
get
方法来检索该值。- Specified by:
-
put
在接口Map<K,V>
- Specified by:
-
put
在Dictionary<K,V>
- 参数
-
key
- 哈希表键 -
value
- 值 - 结果
-
此散列表中指定键的上一个值,如果没有,
null
- 异常
-
NullPointerException
- 如果键或值为null
- 另请参见:
-
Object.equals(Object)
,get(Object)
-
remove
public V remove(Object key)
从此散列表中删除键(及其对应的值)。 如果键不在哈希表中,此方法不执行任何操作。- Specified by:
-
remove
在接口Map<K,V>
- Specified by:
-
remove
在Dictionary<K,V>
- 参数
-
key
- 需要删除的关键 - 结果
-
密钥映射到此散列表中的值,如果密钥没有映射,
null
- 异常
-
NullPointerException
- 如果键是null
-
putAll
public void putAll(Map<? extends K,? extends V> t)
将所有从指定地图的映射复制到此散列表。 这些映射将替换这个散列表对于指定地图中当前的任何键的任何映射。- Specified by:
-
putAll
在接口Map<K,V>
- 参数
-
t
- 要存储在此地图中的映射 - 异常
-
NullPointerException
- 如果指定的地图为空 - 从以下版本开始:
- 1.2
-
clone
public Object clone()
创建这个散列表的浅拷贝。 哈希表本身的所有结构都被复制,但是键和值不被克隆。 这是一个相对昂贵的操作。
-
toString
public String toString()
以一组条目的形式返回此Hashtable
对象的字符串表示形式,并以ASCII字符“,
”(逗号和空格)分隔。 每个条目都被渲染为关键字,等号为=
,以及相关联的元素,其中使用toString
方法将键和元素转换为字符串。
-
keySet
public Set<K> keySet()
返回此地图中包含的键的Set
视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作),则迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove
,Set.remove
,removeAll
,retainAll
,和clear
操作。 它不支持add
或addAll
操作。
-
entrySet
public Set<Map.Entry<K,V>> entrySet()
返回此地图中包含的映射的Set
视图。 该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行时修改映射(除了通过迭代器自己的remove
操作,或者通过迭代器返回的映射条目上的setValue
操作),迭代的结果是未定义的。 该组支持元件移除,即从映射中相应的映射,经由Iterator.remove
,Set.remove
,removeAll
,retainAll
和clear
操作。 它不支持add
或addAll
操作。
-
values
public Collection<V> values()
返回此地图中包含的值的Collection
视图。 集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。 如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove
操作),迭代的结果是未定义的。 该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove
,Collection.remove
,removeAll
,retainAll
和clear
操作。 它不支持add
或addAll
操作。
-
equals
public boolean equals(Object o)
根据Map界面中的定义,将指定的对象与此Map进行比较以相等。
-
hashCode
public int hashCode()
按照Map界面中的定义返回此Map的哈希码值。
-
getOrDefault
public V getOrDefault(Object key, V defaultValue)
说明从界面Map
复制返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue
。- Specified by:
-
getOrDefault
在接口Map<K,V>
- 参数
-
key
- 要返回其关联值的键 -
defaultValue
- 键的默认映射 - 结果
-
映射指定键的值,如果此映射不包含键的映射,
defaultValue
-
forEach
public void forEach(BiConsumer<? super K,? super V> action)
说明从界面Map
复制对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。 除非实现类另有指定,否则按照进入设置迭代的顺序执行操作(如果指定了迭代顺序)。操作引发的异常被转发给调用者。
-
replaceAll
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
说明从界面Map
复制将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。 函数抛出的异常被转发给调用方。- Specified by:
-
replaceAll
在接口Map<K,V>
- 参数
-
function
- 应用于每个条目的功能
-
putIfAbsent
public V putIfAbsent(K key, V value)
描述从接口Map
复制如果指定的键尚未与值相关联(或映射到null
)将其与给定值相关联并返回null
,否则返回当前值。- Specified by:
-
putIfAbsent
在接口Map<K,V>
- 参数
-
key
- 指定值与之关联的键 -
value
- 与指定键相关联的值 - 结果
-
与指定键相关联的上一个值,如果没有键的映射,
null
。 (Anull
返回也可以指示映射以前关联的null
与密钥,如果实现支持空值)。
-
computeIfAbsent
public 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);
映射函数在计算过程中不应该修改该映射。
如果映射函数在计算过程中修改了该映射,这个方法将尽力而为地抛出一个
ConcurrentModificationException
。- Specified by:
-
computeIfAbsent
在接口Map<K,V>
- 参数
-
key
- 与其关联的指定值的键 -
mappingFunction
- 计算值的映射函数 - 结果
- 与指定键相关联的当前(现有或计算)值,如果计算值为空,则为null
- 异常
-
ConcurrentModificationException
- 如果检测到映射函数修改了此映射
-
computeIfPresent
public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。如果重映射函数返回
null
,则映射将被删除。 如果重映射函数本身引发(未检查)异常,则重新引导异常,并且当前映射保持不变。重映射功能在计算过程中不应修改此映射。
如果重映射功能在计算过程中修改了该映射,则该方法将尽力而为地抛出
ConcurrentModificationException
。- Specified by:
-
computeIfPresent
在接口Map<K,V>
- 参数
-
key
- 要与其关联的指定值的键 -
remappingFunction
- 用于计算值的重映射函数 - 结果
- 与指定键相关的新值,如果没有则为null
- 异常
-
ConcurrentModificationException
- 如果检测到重映射功能修改了该地图
-
compute
public V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
尝试计算指定密钥及其当前映射值的映射(如果没有当前映射,则null
)。 例如,要为值映射创建或附加String
msg:map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
merge()
通常更容易用于此目的。)如果重映射函数返回
null
,映射将被删除(如果最初不存在,则保持不存在)。 如果重映射函数本身引发(未检查)异常,则重新引导异常,并且当前映射保持不变。重映射功能在计算过程中不应修改此映射。
如果重映射功能在计算过程中修改了该映射,这个方法将尽力而为地抛出一个
ConcurrentModificationException
。- Specified by:
-
compute
在接口Map<K,V>
- 参数
-
key
- 要与其关联的指定值的键 -
remappingFunction
- 计算值的重映射函数 - 结果
- 与指定键相关的新值,如果没有则为null
- 异常
-
ConcurrentModificationException
- 如果检测到重映射功能修改了该地图
-
merge
public V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。 否则,将关联值替换为给定重映射函数的结果,如果结果为null
,则将其null
。 当组合键的多个映射值时,该方法可能是有用的。 例如,要为值映射创建或附加String msg
:map.merge(key, msg, String::concat)
如果重映射函数返回
null
,则映射将被删除。 如果重映射函数本身引发(未检查)异常,则重新引导异常,并且当前映射保持不变。重映射功能在计算过程中不应修改此映射。
如果重新映射功能在计算过程中修改了该映射,这个方法将尽力而为地抛出一个
ConcurrentModificationException
。- Specified by:
-
merge
在接口Map<K,V>
- 参数
-
key
- 与其结合的值相关联的键 -
value
- 要与与密钥相关联的现有值合并的非空值,或者如果没有与密钥相关联的现有值或空值与密钥相关联 -
remappingFunction
- 如果存在重新计算值的重映射功能 - 结果
- 与指定键相关联的新值,如果没有值与该键相关联,则返回null
- 异常
-
ConcurrentModificationException
- if it is detected that the remapping function modified this map
-
-