public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
null
对象可以作为key或值。
成功地向哈希表中存储或检索对象,作为key的对象必须实现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方法返回这个类的所有的“集合视图的方法“快速失败:如果哈希表结构修改后迭代器创建的任何时间,以任何方式除了通过迭代器的remove方法,迭代器将抛出一个ConcurrentModificationException
。因此,在遇到同步修改,迭代器不能快速、干净,而不是冒着任意的,非在将来一个不确定的时间确定的行为。枚举返回Hashtable的键和元素的方法不能快速失败。
注意迭代器不能快速失败行为得到保证的话,一般来说,不可能在不同步的并发修改的存在作出难以保证。快速失败迭代器扔ConcurrentModificationException尽最大努力的基础上。因此,要写一个程序,依靠这一例外的正确性错误:快速失败迭代器的行为只能用来检测错误。
作为java 2平台V1.2,这类改造实施Map
接口,使得它的 Java Collections Framework成员。不像新采集的实现,Hashtable
是同步的。如果一个线程安全的实现是不需要的,建议在地方Hashtable
使用HashMap
。如果一个线程安全的高度并行执行的需要,那么建议在地方Hashtable
使用ConcurrentHashMap
。
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)
构建了一种新的哈希表作为给定Map相同的映射。
|
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 ),尝试使用给定的映射功能,进入到这个Map除非
null 计算其价值。
|
V |
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)
如果指定键的值是存在和非空的,尝试计算一个新的映射,给出了键和它当前的映射值。
|
boolean |
contains(Object value)
测试是否有key映射到哈希表中指定的值。
|
boolean |
containsKey(Object key)
测试指定对象是否是一个哈希表的键。
|
boolean |
containsValue(Object value)
如果哈希表映射到一个或多个键的值返回true。
|
Enumeration<V> |
elements()
返回哈希表中的值的枚举。
|
Set<Map.Entry<K,V>> |
entrySet()
返回一个
Set 映射的视图包含在这个Map。
|
boolean |
equals(Object o)
将指定的对象与此映射的相等性进行比较,按照Map接口中的定义。
|
void |
forEach(BiConsumer<? super K,? super V> action)
在该映射中的每个条目执行给定的操作,直到所有的条目被处理或操作抛出异常。
|
V |
get(Object key)
返回指定的键映射的值,或
null 如果这个Map不包含的键映射。
|
V |
getOrDefault(Object key, V defaultValue)
返回指定的键映射的值,或
defaultValue 如果这个Map不包含的键映射。
|
int |
hashCode()
返回此映射的哈希代码值,按Map接口的定义。
|
boolean |
isEmpty()
如果没有键值的哈希表映射。
|
Enumeration<K> |
keys()
返回哈希表中的键枚举。
|
Set<K> |
keySet()
返回一个
Set 查看键包含在这个Map。
|
V |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
如果指定的键已与值相关联的值或与空值相关联的,则将其与给定的非空值关联。
|
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 的价值观包含在这个Map。
|
public Hashtable(int initialCapacity, float loadFactor)
initialCapacity
-哈希表的初始容量。
loadFactor
-哈希表的负载因子。
IllegalArgumentException
如果初始容量小于零,或者负载因子是负的。
public Hashtable(int initialCapacity)
initialCapacity
-哈希表的初始容量。
IllegalArgumentException
如果初始容量小于零。
public Hashtable()
public Hashtable(Map<? extends K,? extends V> t)
t
的映射被放置在这个Map的Map。
NullPointerException
-如果指定的Map是空的。
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)
containsKey
方法更昂贵。
请注意,此方法在功能containsValue
相同,(这是在集合框架的Map
接口部分)。
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
如果这个Map不包含的键映射。
更正式地说,如果这个图中包含了从关键k
到价值v
这样(key.equals(k))
映射,那么这个方法返回v
;否则返回null
。(最多可以有一个这样的映射。)
get
接口
Map<K,V>
get
方法重写,继承类
Dictionary<K,V>
key
-关键的相关值被返回
null
如果这个Map不包含的键映射
NullPointerException
-如果指定的键是空的
put(Object, Object)
protected void rehash()
public V put(K key, V value)
key
到哈希表中指定的
value
。key和值可以
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
映射被存储在这个Map
NullPointerException
-如果指定的Map是空的
public Object clone()
public String toString()
public Set<K> keySet()
Set
查看键包含在这个Map。该集合是由Map的支持,所以对Map的变化反映在集合中,反之亦然。如果Map是在设置一个迭代过程中修改(除非通过迭代器的
remove操作),迭代的结果是不确定的。设置支持元素的去除,从Map中移除相应的映射,通过
Iterator.remove,
Set.remove,
removeAll,
retainAll,和
clear操作。它不支持
add或
addAll操作。
public Set<Map.Entry<K,V>> entrySet()
Set
视图的映射包含在这个Map。该集合是由Map的支持,所以对Map的变化反映在集合中,反之亦然。如果Map是在设置一个迭代过程中修改(除非通过迭代器的
remove操作,或通过
setValue操作返回的迭代器的映射项)的迭代的结果是不确定的。设置支持元素的去除,从Map中移除相应的映射,通过
Iterator.remove,
Set.remove,
removeAll,
retainAll和
clear操作。它不支持
add或
addAll操作。
public Collection<V> values()
Collection
视图的值包含在这个Map。集合是由Map支持的,所以对Map的变化反映在集合中,反之亦然。如果Map是在集合的迭代进行修改(除非通过迭代器的
remove操作),迭代的结果是不确定的。收集支持元素的去除,从Map中移除相应的映射,通过
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
如果这个Map不包含的键映射。
getOrDefault
接口
Map<K,V>
key
-关键的相关值被返回
defaultValue
-键的默认映射
defaultValue
如果这个Map不包含的键映射
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
如果没有键映射。(一
null
返回也表明,与先前的
null
Map的关键,如果实施支持空值。)
public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)
Map
null
),尝试使用给定的映射功能,进入到这个Map除非
null
计算其价值。
如果函数返回null
没有映射记录。如果函数抛出一个(没有)异常,异常会被重新抛出,没有映射记录。最常见的用法是构造一个新对象作为初始映射值或memoized的结果,如:
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
味精到值的映射:
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
映射被删除。如果函数抛出一个(没有)异常,异常会被重新抛出,和当前映射保持不变。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.