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方法返回的迭代器是故障快速的 :如果Hashtable在迭代器创建之后的任何时间被结构地修改,除了通过迭代器自己的remove方法,迭代器会抛出一个ConcurrentModificationException
。 因此,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为。 Hashtable的键和元素方法返回的枚举不是故障快速的。
请注意,迭代器的故障快速行为无法保证,因为一般来说,在不同步并发修改的情况下,无法做出任何硬性保证。 失败快速迭代器尽力投入ConcurrentModificationException 。 因此,编写依赖于此异常的程序的正确性将是错误的:迭代器的故障快速行为应仅用于检测错误。
从Java 2平台v1.2,这个类被改造为实现Map
接口,使其成为成员Java Collections Framework 。 与新的集合实现不同, Hashtable
是同步的。 如果不需要线程安全的实现,建议使用HashMap
代替Hashtable
。 如果需要线程安全的并发实现,那么建议使用ConcurrentHashMap
代替Hashtable
。
Object.equals(java.lang.Object)
, Object.hashCode()
, rehash()
, Collection
, Map
, HashMap
, TreeMap
, Serialized Form
Constructor and Description |
---|
Hashtable()
构造一个新的,空的散列表,默认初始容量(11)和负载因子(0.75)。
|
Hashtable(int initialCapacity)
构造一个新的,空的哈希表,具有指定的初始容量和默认负载因子(0.75)。
|
Hashtable(int initialCapacity, float loadFactor)
构造一个新的,空的哈希表,具有指定的初始容量和指定的负载因子。
|
Hashtable(Map<? extends K,? extends V> t)
构造一个与给定地图相同的映射的新哈希表。
|
Modifier and Type | Method and Description |
---|---|
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 映射到此
key
value 中指定的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 视图。
|
public Hashtable(int initialCapacity, float loadFactor)
initialCapacity
-
initialCapacity
的初始容量。
loadFactor
-
loadFactor
的负载系数。
IllegalArgumentException
- 如果初始容量小于零,或者负载因子是非正性的。
public Hashtable(int initialCapacity)
initialCapacity
-
initialCapacity
的初始容量。
IllegalArgumentException
- 如果初始容量小于零。
public Hashtable()
public Hashtable(Map<? extends K,? extends V> t)
t
- 其映射将放置在该地图中的地图。
NullPointerException
- 如果指定的地图为空。
public int size()
public boolean isEmpty()
public Enumeration<K> keys()
keys
在类别
Dictionary<K,V>
Enumeration
, elements()
, keySet()
, Map
public Enumeration<V> elements()
elements
在类别
Dictionary<K,V>
Enumeration
, keys()
, values()
, Map
public boolean contains(Object value)
value
- 要搜索的值
true
当且仅当一些键映射到value
在由equals方法测定该散列表的参数;
false
否则。
NullPointerException
- 如果值为
null
public boolean containsValue(Object value)
containsValue
在界面
Map<K,V>
value
- 要在该散列表中存在的值要进行测试
NullPointerException
- 如果值为
null
public boolean containsKey(Object key)
containsKey
在界面
Map<K,V>
key
- 可能的键
true
当且仅当指定的对象是此散列表中的键时,由equals方法确定;
false
否则。
NullPointerException
- 如果键是
null
contains(Object)
public V get(Object key)
null
如果此映射包含该键的映射。
更正式地,如果这张地图包含从一个键k
到一个值v
,这样(key.equals(k))
,那么这个方法返回v
; 否则返回null
。 (最多可以有一个这样的映射。)
get
在界面
Map<K,V>
get
在类别
Dictionary<K,V>
key
- 要返回其关联值的键
null
NullPointerException
- 如果指定的键为空
put(Object, Object)
protected void rehash()
public V put(K key, V value)
key
映射到此key
value
中指定的value。
钥匙和价值都不能是null
。
可以通过使用等于原始密钥的密钥来调用get
方法来检索该值。
put
在界面
Map<K,V>
put
在类别
Dictionary<K,V>
key
- 哈希表键
value
- 值
null
NullPointerException
- 如果键或值为
null
Object.equals(Object)
,
get(Object)
public V remove(Object key)
remove
在界面
Map<K,V>
remove
在类别
Dictionary<K,V>
key
- 需要删除的关键
null
如果该键没有映射
NullPointerException
- 如果键是
null
public void putAll(Map<? extends K,? extends V> t)
putAll
在界面
Map<K,V>
t
- 要存储在此地图中的映射
NullPointerException
- 如果指定的地图为空
public Object clone()
public String toString()
public Set<K> keySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
public Set<Map.Entry<K,V>> entrySet()
Set
视图。
该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作,或者通过迭代器返回的映射条目上的setValue操作),迭代的结果是未定义的。
该组支持元件移除,即从映射中相应的映射,经由Iterator.remove,Set.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
public Collection<V> values()
Collection
视图。
集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。
如果在集合中的迭代正在进行中修改映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。
该collection支持元素移除,即从映射中相应的映射,经由Iterator.remove,Collection.remove,removeAll,retainAll和clear操作。
它不支持add或addAll操作。
public boolean equals(Object o)
public int hashCode()
public V getOrDefault(Object key, V defaultValue)
Map
复制
defaultValue
如果此映射包含该键的映射。
getOrDefault
在界面
Map<K,V>
key
- 要返回其关联值的键
defaultValue
- 键的默认映射
defaultValue
public void forEach(BiConsumer<? super K,? super V> action)
Map
复制
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Map
复制
replaceAll
在界面
Map<K,V>
function
- 应用于每个条目的功能
public V putIfAbsent(K key, V value)
Map
复制
null
)将其与给定值相关联并返回
null
,否则返回当前值。
putIfAbsent
在界面
Map<K,V>
key
- 指定值与之关联的键
value
- 与指定键相关联的值
null
。
(A null
返回也可以指示以前关联的映射关系为null
,如果实现支持空值)。
public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
Map
复制
null
),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非null
。
如果函数返回null
则不记录映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且不记录映射。 最常见的用法是构造一个用作初始映射值或记忆结果的新对象,如:
map.computeIfAbsent(key, k -> new Value(f(k)));
或者实现一个多值地图, Map<K,Collection<V>>
,每个键支持多个值:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);
computeIfAbsent
在界面
Map<K,V>
key
- 指定值与之关联的键
mappingFunction
- 计算值的函数
public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Map
复制
如果函数返回null
,则删除映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
computeIfPresent
在界面
Map<K,V>
key
- 指定值与之关联的键
remappingFunction
- 计算值的函数
public V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
Map
复制
null
如果没有当前映射)。
例如,要为值映射创建或附加一个String
msg:
map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))
(方法merge()
通常更容易用于此类目的。)
如果函数返回null
,则映射将被删除(如果最初缺少,则保持不存在)。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。
public V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
Map
复制
null
。
当组合键的多个映射值时,该方法可能是有用的。
例如,要创建或追加String msg
到值映射:
map.merge(key, msg, String::concat)
如果函数返回null
,则删除该映射。 如果函数本身引发(未检查)异常,则异常被重新引导,并且当前映射保持不变。