此类实现了哈希表用来匹配键值对。任何非空对象都可以当作哈希表里的键或者值。
要使用哈希表成功的存取数据, 用作键的对象必须实现hashCode和equals方法。
Hashtable有两个影响性能的参数:初始容量和装载因子。容量就是哈希表中的桶数量,初始容量就是哈希表刚刚创建时的桶的数量。注意,哈希表是开放式的哈希:一旦有哈希冲突,一个桶会存放多个元素,只能逐个查找。而装载因子就是决定哈希表在容量自动增长之前可以允许有多满的一个测量因子。初始容量和负载因子仅仅是实现的提示,对具体实现影响不大。 再哈希什么时候以及在什么地方调用是和实现密切相关的。
有一个普遍的规律,那就是装载因子是0.75的时候,刚好达到了时间和空间上消耗平衡。更高的值可以减少空间的消耗但是也会增加查找的成本(这会影响大部分的Hashtable操作,包括get和put)。
初始容量控制着空间使用和时间消耗(再哈希的次数)之间的平衡。 如果初始容量>存储元素的最大数量/装载因子 再哈希的操作将不会发生。然而设置过大的初始容量很明显会浪费空间。
如果一个Hashtable要存储很多数据,创建时给它足够大的容量能够有效的存储元素,而不需要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的所有集合查看方法(集合查看方法:keySet,values,entrySet)返回的迭代都是fail-fast模式的。什么是fail-fast:当迭代创建后的任何时间里任何方式Hashtable的结构变了,迭代都会抛出 ConcurrentModificationException异常 (如果迭代只是自己调用了remove,不会有异常)。因此,一旦碰到并发改动,迭代就快速干脆的失败报错了,而不是把这种不定的风险,无法预料的行为留在未知后期。Hashtable的键和值返回的枚举不是fail-fast模式的。
从Java1.2的时候, Hashtable做过改进, 实现了Map接口,使它成为了Java合集框架中的一员。不像后来的其它合集的实现, Hashtable是同步的(线程安全的)。如果不需要线程安全,可以使用HashMap来代替Hashtable。 如果需要线程安全还需要高并发操作(要求性能好),可以用ConcurrentHashMap来代替Hashtable.
原文见:
https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html