阅读(2161) (0)

鸿蒙OS Hashtable

2022-06-16 16:24:42 更新

Hashtable

java.lang.Object

|---java.util.Dictionary<K,V&

|---|---java.util.Hashtable<K,V&

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable

这个类实现了一个哈希表,它将键映射到值。 任何非空对象都可以用作键或值。

要成功地从哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

Hashtable 的实例有两个影响其性能的参数:初始容量和负载因子。 容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。 注意哈希表是开放的:在“哈希冲突”的情况下,单个桶存储多个条目,必须按顺序搜索。 负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。 初始容量和负载因子参数只是实现的提示。 关于何时以及是否调用 rehash 方法的确切细节取决于实现。

通常,默认负载因子 (.75) 在时间和空间成本之间提供了良好的折衷。 较高的值会减少空间开销,但会增加查找条目的时间成本(这反映在大多数 Hashtable 操作中,包括 get 和 put)。

初始容量控制了浪费空间和需要重新哈希操作之间的权衡,这些操作非常耗时。 如果初始容量大于 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);
   }

由此类的所有“集合视图方法”返回的集合的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对 Hashtable 进行结构修改,除了通过迭代器自己的删除之外的任何方式 方法,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 Hashtable 的键和元素方法返回的枚举不是快速失败的。

请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。

从 Java 2 平台 v1.2 开始,该类被改进为实现 Map 接口,使其成为 Java Collections Framework 的成员。 与新的集合实现不同,Hashtable 是同步的。 如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。 如果需要线程安全的高并发实现,那么建议使用 ConcurrentHashMap 代替 Hashtable。

嵌套类摘要

从接口 java.util.Map 继承的嵌套类/接口
Map.EntryK,V

构造函数摘要

构造函数 描述
Hashtable() 构造一个具有默认初始容量 (11) 和加载因子 (0.75) 的新的空哈希表。
Hashtable(int initialCapacity) 使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空哈希表。
Hashtable(int initialCapacity, float loadFactor) 使用指定的初始容量和指定的负载因子构造一个新的空哈希表。
Hashtable(Map<? extends K,? extends V> t) 构造一个与给定 Map 具有相同映射的新哈希表。

方法总结

修饰符和类型 方法 描述
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。
EnumerationV elements() 返回此哈希表中的值的枚举。
SetMap.EntryK,V entrySet() 返回此映射中包含的映射的 Set 视图。
boolean equals(Object o) 根据 Map 接口中的定义,比较指定的 Object 与此 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() 测试此哈希表是否没有将键映射到值。
EnumerationK keys() 返回此哈希表中键的枚举。
SetK keySet() 返回此映射中包含的键的 Set 视图。
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。
V put(K key, V 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 字符“、”(逗号和空格)分隔。
CollectionV values() 返回此映射中包含的值的集合视图。
从类 java.lang.Object 继承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait

构造函数详细信息

Hashtable

public Hashtable(int initialCapacity, float loadFactor)

使用指定的初始容量和指定的负载因子构造一个新的空哈希表。

参数:

参数名称 参数描述
initialCapacity 哈希表的初始容量。
loadFactor 哈希表的负载因子。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果初始容量小于零,或者负载因子为非正数。

Hashtable

public Hashtable(int initialCapacity)

使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空哈希表。

参数:

参数名称 参数描述
initialCapacity 哈希表的初始容量。

Throws:

Throw名称 Throw描述
IllegalArgumentException 如果初始容量小于零。

Hashtable

public Hashtable()

构造一个具有默认初始容量 (11) 和加载因子 (0.75) 的新的空哈希表。

Hashtable

public Hashtable(Map<? extends K,? extends V> t)

构造一个与给定 Map 具有相同映射的新哈希表。 哈希表的初始容量足以容纳给定 Map 中的映射和默认加载因子 (0.75)。

参数:

参数名称 参数描述
t 其映射将放置在此 map 中的 map。

Throws:

Throw名称 Throw描述
NullPointerException 如果指定的 map 为空。

方法详情

size

public int size()

返回此哈希表中的键数。

指定者:

接口 MapK,V 中的大小

指定者:

DictionaryK,V 类中的大小

返回:

此哈希表中的键数。

isEmpty

public boolean isEmpty()

测试此哈希表是否没有将键映射到值。

指定者:

接口 MapK,V 中的 isEmpty

指定者:

类 DictionaryK,V 中的 isEmpty

返回:

如果此哈希表没有将键映射到值,则为 true; 否则为 false。

keys

public EnumerationK keys()

返回此哈希表中键的枚举。

指定者:

DictionaryK,V 类中的键

返回:

此哈希表中键的枚举。

elements

public EnumerationV elements()

返回此哈希表中的值的枚举。 对返回的对象使用 Enumeration 方法按顺序获取元素。

指定者:

DictionaryK,V 类中的元素

返回:

此哈希表中的值的枚举。

contains

public boolean contains(Object value)

测试某些键是否映射到此哈希表中的指定值。 此操作比 containsKey 方法更昂贵。

请注意,此方法在功能上与 containsValue 相同(它是集合框架中 Map 接口的一部分)。

参数:

参数名称 参数描述
value 要搜索的值

返回:

当且仅当某些键映射到由 equals 方法确定的此哈希表中的 value 参数时,才为 true; 否则为 false。

Throws:

Throw名称 Throw描述
NullPointerException 如果 value 为空

containsValue

public boolean containsValue(Object value)

如果此哈希表将一个或多个键映射到此值,则返回 true。

请注意,此方法在功能上与 contains 相同(早于 Map 接口)。

指定者:

接口 MapK,V 中的 containsValue

参数:

参数名称 参数描述
value 要测试其在此哈希表中的存在的值

返回:

如果此映射将一个或多个键映射到指定值,则为 true

Throws:

Throw名称 Throw描述
NullPointerException 如果 value 为空

containsKey

public boolean containsKey(Object key)

测试指定对象是否是此哈希表中的键。

指定者:

containsKey 在接口 MapK,V

参数:

参数名称 参数描述
key 可能的 key

返回:

当且仅当指定对象是此哈希表中的键(由 equals 方法确定)时才为 true; 否则为false。

Throws:

Throw名称 Throw描述
NullPointerException 如果 key 为空

get

public V get(Object key)

返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。

更正式地说,如果此映射包含从键 k 到值 v 的映射,满足 (key.equals(k)),则此方法返回 v; 否则返回null。 (最多可以有一个这样的映射。)

指定者:

进入接口 MapK,V

指定者:

进入类 DictionaryK,V

参数:

参数名称 参数描述
key 要返回其关联值的键

返回:

指定键映射到的值,如果此映射不包含该键的映射,则为 null

Throws:

Throw名称 Throw描述
NullPointerException 如果指定的键为空

rehash

protected void rehash()

增加此哈希表的容量并在内部重新组织此哈希表,以便更有效地容纳和访问其条目。 当哈希表中的键数超过此哈希表的容量和负载因子时,将自动调用此方法。

put

public V put(K key, V value)

将指定键映射到此哈希表中的指定值。 键和值都不能为空。

可以通过使用与原始键相同的键调用 get 方法来检索该值。

指定者:

放入接口 MapK,V

指定者:

放入类 DictionaryK,V

参数:

参数名称 参数描述
key 哈希表键
value

返回:

此哈希表中指定键的前一个值,如果没有,则返回 null

Throws:

Throw名称 Throw描述
NullPointerException 如果 key 或者 value 为空

remove

public V remove(Object key)

从此哈希表中删除键(及其对应的值)。 如果键不在哈希表中,则此方法不执行任何操作。

指定者:

在接口 MapK,V 中删除

指定者:

在类 DictionaryK,V 中删除

参数:

参数名称 参数描述
key 需要删除的密钥

返回:

键在此哈希表中映射到的值,如果键没有映射,则返回 null

Throws:

Throw名称 Throw描述
NullPointerException 如果 key 为空

putAll

public void putAll(Map<? extends K,? extends V> t)

将所有映射从指定映射复制到此哈希表。 这些映射将替换此哈希表对当前指定映射中的任何键的任何映射。

指定者:

putAll在接口MapK,V中

参数:

参数名称 参数描述
t 要存储在此 map 中的映射

Throws:

Throw名称 Throw描述
NullPointerException 如果指定的 map 为空

clear

public void clear()

清除此哈希表,使其不包含任何键。

指定者:

在 interface MapK,V 中清除

clone

public Object clone()

创建此哈希表的浅表副本。 哈希表本身的所有结构都被复制,但键和值没有被克隆。 这是一个相对昂贵的操作。

覆盖:

在类 Object 中克隆

返回:

哈希表的克隆

toString

public String toString()

以一组条目的形式返回此 Hashtable 对象的字符串表示形式,用大括号括起来并由 ASCII 字符“、”(逗号和空格)分隔。 每个条目都呈现为键、等号 = 和关联的元素,其中 toString 方法用于将键和元素转换为字符串。

覆盖:

类 Object 中的 toString

返回:

此哈希表的字符串表示形式

keySet

public SetK keySet()

返回此映射中包含的键的 Set 视图。 集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。 该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的 keySet

返回:

此 map 中包含的键的集合视图

entrySet

public SetMap.EntryK,V entrySet()

返回此映射中包含的映射的 Set 视图。 集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作或通过迭代器返回的映射条目上的 setValue 操作除外),则迭代的结果是未定义的。 该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的 entrySet

返回:

此 map 中包含的映射的集合视图

values

public CollectionV values()

返回此映射中包含的值的集合视图。 集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。 如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。 该集合支持元素移除,即通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的值

返回:

此 map 中包含的值的集合视图

equals

public boolean equals(Object o)

根据 Map 接口中的定义,比较指定的 Object 与此 Map 是否相等。

指定者:

接口 MapK,V 中的等于

覆盖:

类 Object 中的等于

参数:

参数名称 参数描述
o 要与此哈希表比较是否相等的对象

返回:

如果指定的 Object 等于此 Map,则为 true

hashCode

public int hashCode()

根据 Map 接口中的定义返回此 Map 的哈希码值。

指定者:

接口 MapK,V 中的 hashCode

覆盖:

类 Object 中的 hashCode

返回:

此对象的哈希码值。

getOrDefault

public V getOrDefault(Object key, V defaultValue)

从接口复制的描述:map

返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue。

指定者:

接口 MapK,V 中的 getOrDefault

参数:

参数名称 参数描述
key 要返回其关联值的键
defaultValue 键的默认映射

返回:

指定键映射到的值,如果此映射不包含该键的映射,则为 defaultValue

forEach

public void forEach(BiConsumer<? super K,? super V> action)

从接口复制的描述:map

对该映射中的每个条目执行给定的操作,直到处理完所有条目或该操作引发异常。 除非实现类另有规定,否则按照条目集迭代的顺序执行动作(如果指定了迭代顺序)。动作抛出的异常将转发给调用者。

指定者:

接口 MapK,V 中的 forEach

参数:

参数名称 参数描述
action 为每个条目执行的操作

replaceAll

public void replaceAll(BiFunction<? super K,? super V,? extends V> function)

从接口复制的描述:map

将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都已处理或该函数引发异常。 函数抛出的异常被转发给调用者。

指定者:

接口 MapK,V 中的 replaceAll

参数:

参数名称 参数描述
function 应用于每个条目的函数

putIfAbsent

public V putIfAbsent(K key, V value)

从接口复制的描述:map

如果指定的键尚未与值关联(或映射到 null),则将其与给定值关联并返回 null,否则返回当前值。

指定者:

将IfAbsent放入接口MapK,V

参数:

参数名称 参数描述
key 与指定值关联的键
value 与指定键关联的值

返回:

与指定键关联的前一个值,如果键没有映射,则返回 null。 (如果实现支持 null 值,则返回 null 还可以指示映射先前将 null 与键关联。)

remove

public boolean remove(Object key, Object value)

从接口复制的描述:map

仅当当前映射到指定值时,才删除指定键的条目。

指定者:

在接口 MapK,V 中删除

参数:

参数名称 参数描述
key 与指定值关联的键
value 预期与指定键关联的值

返回:

如果值已被删除,则为 true

replace

public boolean replace(K key, V oldValue, V newValue)

从接口复制的描述:map

仅当当前映射到指定值时才替换指定键的条目。

指定者:

在接口 MapK,V 中替换

参数:

参数名称 参数描述
key 与指定值关联的键
oldValue 预期与指定键关联的值
newValue 与指定键关联的值

返回:

如果值被替换,则为 true

replace

public V replace(K key, V value)

从接口复制的描述:map

仅当当前映射到某个值时才替换指定键的条目。

指定者:

在接口 MapK,V 中替换

参数:

参数名称 参数描述
key 与指定值关联的键
value 与指定键关联的值

返回:

与指定键关联的前一个值,如果键没有映射,则返回 null。 (如果实现支持 null 值,则返回 null 还可以指示映射先前将 null 与键关联。)

computeIfAbsent

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); 

指定者:

接口 MapK,V 中的 computeIfAbsent

参数:

参数名称 参数描述
key 与指定值关联的键
mappingFunction 计算值的函数

返回:

与指定键关联的当前(现有或计算的)值,如果计算的值为 null,则为 null

computeIfPresent

public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

从接口复制的描述:map

如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。

如果函数返回 null,则删除映射。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。

指定者:

接口 MapK,V 中的 computeIfPresent

参数:

参数名称 参数描述
key 与指定值关联的键
remappingFunction 计算值的函数

返回:

与指定键关联的新值,如果没有,则为 null

compute

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,则删除映射(如果最初不存在,则保持不存在)。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。

指定者:

在接口 MapK,V 中计算

参数:

参数名称 参数描述
key 与指定值关联的键
remappingFunction 计算值的函数

返回:

与指定键关联的新值,如果没有,则为 null

merge

public V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)

从接口复制的描述:map

如果指定的键尚未与值关联或与 null 关联,则将其与给定的非 null 值关联。 否则,将关联的值替换为给定重映射函数的结果,如果结果为 null,则将其删除。 当为一个键组合多个映射值时,此方法可能很有用。 例如,要创建或附加 String msg 到值映射:

  map.merge(key, msg, String::concat) 

如果函数返回 null,则删除映射。 如果函数本身抛出(未经检查的)异常,则重新抛出异常,并且当前映射保持不变。

指定者:

在接口 MapK,V 中合并

参数:

参数名称 参数描述
key 与结果值关联的键
value 要与键关联的现有值合并的非空值,或者如果没有现有值或空值与键关联,则与键关联
remappingFunction 重新计算值的函数(如果存在)

返回:

与指定键关联的新值,如果没有值与该键关联,则为 null