Java Hashtable
Hashtable 类实现了一个哈希表,它将键映射到值。任何非空对象都可以被用作键或值。为了成功地从哈希表中存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。
Hashtable的特点
- 它类似于HashMap,但是是同步的。
- Hashtable在哈希表中存储键/值对。
- 在Hashtable中,我们指定一个作为键的对象,以及我们想与该键关联的值。然后对键进行散列,得到的散列码被用作索引,该值被存储在表中。
- Hashtable类的初始默认容量是11,而loadFactor是0.75。
- HashMap不提供任何枚举,而Hashtable则不提供失效的枚举。
声明
类型参数
- K – 这个地图所维护的键的类型
- V– 映射的值的类型
Hashtable的层次结构
Hashtable实现了 Serializable 、 Cloneable 、Map<K,V>接口并扩展了Dictionary<K,V>。直接的子类是 Properties , UIDefaults .
构造函数
为了创建一个Hashtable,我们需要从 java.util.Hashtable 导入它 。 我们可以通过各种方式来创建一个Hashtable。
1.Hashtable(): 这将创建一个空的Hashtable,默认负载因子为0.75,初始容量为11。
Hashtable<K, V> ht = new Hashtable<K, V>()
输出
2.Hashtable(int initialCapacity): 这将创建一个哈希表,其初始大小由initialCapacity指定,默认的负载因子为0.75。
Hashtable<K, V> ht = new Hashtable<K, V>(int initialCapacity)
输出
3.Hashtable(int size, float fillRatio): 这个版本创建了一个哈希表,其初始大小由size指定,填充率由fillRatio指定。基本上,它决定了一个哈希表在向上调整大小之前可以有多满,其值在0.0到1.0之间。
Hashtable<K, V> ht = new Hashtable<K, V>(int size, float fillRatio)
输出
**4.Hashtable(Map <?extends K,?extends V> m): **这将创建一个哈希表,用m中的元素进行初始化。
Hashtable<K, V> ht = new Hashtable<K, V>(Map m)
输出
例子
输出
对Hashtable进行各种操作
1.添加元素: 为了向hashtable添加一个元素,我们可以使用put()方法。然而,插入的顺序并没有保留在hashtable中。在内部,对于每一个元素,都会产生一个单独的哈希值,并且基于这个哈希值对元素进行索引,以使其更有效率。
输出
2.改变元素: 在添加元素后,如果我们想改变元素,可以通过put()方法再次添加元素来完成。由于hashtable中的元素是用键来索引的,所以键的值可以通过简单地插入我们想改变的键的更新值来改变。
输出
3.删除元素: 为了从地图中删除一个元素,我们可以使用remove()方法。该方法接收键值,如果该键存在于地图中,则从该地图中删除该键的映射。
输出
4.遍历哈希表: 为了遍历该表,我们可以使用一个高级for循环。下面是遍历一个哈希表的例子。
输出
哈希图表的内部工作
Hashtable数据结构是一个存储键/值对的桶的数组。它利用 hashCode()方法 来确定键/值对应该映射到哪个桶。
散列函数有助于确定一个给定的键在桶列表中的位置。一般来说,hashcode是一个非负的整数,对于相等的对象来说是相等的,对于不相等的对象来说可能是相等的,也可能不是。为了确定两个对象是否相等,hashtable使用了equals()方法。
两个不相等的对象有可能有相同的哈希码。这被称为 碰撞 为了解决碰撞问题,hashtable使用一个列表数组。映射到单个桶(数组索引)的对被存储在一个列表中,列表引用被存储在数组索引中。
Hashtable的方法
- K – 地图中键的类型。
- V – 在地图中映射的值的类型。
方法 | 描述 |
---|---|
clear() | 清除这个hashtable,使其不包含任何键。 |
clone() | 创建这个hashtable的一个浅层拷贝。 |
compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 试图为指定的键和其当前的映射值计算一个映射(如果没有当前的映射,则为空)。 |
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) | 如果指定的键还没有与一个值相关联(或者被映射为空),则尝试使用给定的映射函数计算其值,并将其输入此映射中,除非为空。 |
computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) | 如果指定的键的值是存在的,并且不是空的,则尝试给定键和其当前的映射值来计算一个新的映射。 |
contains(Object value) | 测试某个键是否映射到这个hashtable中的指定值。 |
containsKey(Object key) | 测试指定的对象是否是这个hashtable中的一个键。 |
containsValue(Object value) | 如果这个hashtable将一个或多个键映射到这个值,返回true。 |
elements() | 返回这个hashtable中的值的枚举。 |
entrySet() | 返回这个地图中包含的映射的Set视图。 |
equals(Object o) | 根据Map接口中的定义,将指定的Object与此Map进行比较,看是否相等。 |
get(Object key) | 返回指定的键被映射到的值,如果此地图不包含键的映射,则返回空值。 |
hashCode() | 按照地图接口的定义,返回该地图的哈希代码值。 |
isEmpty() | 测试这个hashtable是否没有将键映射到值。 |
keys() | 返回这个hashtable中的键的枚举值。 |
keySet() | 返回这个地图中包含的键的Set视图。 |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) | 如果指定的键还没有与一个值相关联或者与空值相关联,那么将其与给定的非空值相关联。 |
put(K key, V value) | 将指定的键映射到这个hashtable中的指定值。 |
putAll(Map<? extends K,? extends V> t) | 将指定地图中的所有映射复制到这个hashtable中。 |
rehash() | 增加这个hashtable的容量并在内部进行重组,以便更有效地容纳和访问其条目。 |
remove(Object key) | 从这个hashtable中删除键(和它的相应值)。 |
size() | 返回这个hashtable中的键的数量。 |
toString() | 返回这个Hashtable对象的字符串表示,其形式是一组条目,用大括号括起来,用ASCII字符”,”(逗号和空格)分开。 |
value() | 返回该地图中包含的值的集合视图。 |
java.util.Map接口中声明的方法
方法 | 描述 |
---|---|
forEach(BiConsumer<? super K,? super V> action) | 对该地图中的每个条目执行给定的操作,直到所有条目都被处理完,或者该操作抛出一个异常。 |
getOrDefault(Object key, V defaultValue) | 返回指定的键被映射到的值,如果这个地图不包含键的映射,则返回defaultValue。 |
putIfAbsent(K key, V value) | 如果指定的键还没有与一个值相关联(或者被映射为null),则将其与给定的值相关联并返回null,否则返回当前值。 |
remove(Object key, Object value) | 只有当指定的键当前被映射到指定的值时,才会删除该键的条目。 |
replace(K key, V value) | 只有当指定的键当前被映射到某个值时,才会替换该键的条目。 |
replace(K key, V oldValue, V newValue) | 只在当前映射到指定值的情况下替换指定键的条目。 |
replaceAll(BiFunction<? super K,? super V,? extends V> function) | 用对该条目调用给定函数的结果替换每个条目的值,直到所有条目都被处理或该函数抛出一个异常。 |