什么是Hashtable?
Java中的Hashtable类实现了Map接口,它将键映射到值。它基于散列的概念运行,其中每个键通过散列函数转化为数组中的一个索引。该索引作为匹配值的存储位置。这里就是Java中的Hashtable类的定义。
public class Hashtable<K,V> extends Dictionary implements Map<K,V>, Cloneable, Serializable
// 这个类实现了可克隆和序列化接口
这里,K 表示此映射中键的类型,V 表示映射值的种类。
关于 Java Hashtable 类的几个要点如下:
- 哈希表是一个存储在数组中的列表集合。每个列表称为一个桶。桶的位置由键的
hashCode()
方法确定。哈希表根据键来存储对应的值。 - 它存储的键必须是唯一的。
- 它不允许任何键或值为 null。如果尝试插入 null 键或值,将会抛出
NullPointerException
。 - 哈希表是同步的。这意味着对哈希表的所有操作都是线程安全的。这种同步机制会带来一定的性能损失,因此,如果不需要线程安全,通常推荐使用 HashMap,因为它的性能更好。
Java Hashtable 的构造函数
- Hashtable(): 创建一个初始容量为11,加载因子为0.75的新哈希表。
- Hashtable(int initialCapacity): 创建一个初始容量为指定值,加载因子为0.75的新哈希表。
- Hashtable(int initialCapacity, float loadFactor): 创建一个初始容量和加载因子均为指定数值的新哈希表。
负载因子是用来衡量哈希表填充程度的指标,当哈希表中的条目数量超过负载因子和当前容量的乘积时,哈希表的容量就会自动增加。当哈希表中的条目数量超过负载因子与当前容量的乘积时,哈希表会进行重新散列(即内部数据结构会被重建),这样哈希表的桶数量就会大约增加到原来的两倍。
通常来说,负载因子(0.75)在时间消耗和空间消耗之间提供了一个很好的折中。较高的值虽然减少了空间消耗,却增加了查找的代价(这主要体现在HashMap类的操作中,例如get和put方法)。在设置初始容量时,我们应当考虑到预期的映射中的条目数量和负载因子,以尽量减少重新散列操作。如果初始容量大于最大条目数除以负载因子,这样就永远不会发生重新散列操作了。
哈希表是一种数据结构,它存储项目以便日后快速查找。哈希表中的每个位置通常称为一个槽,可以存储一个项目,并且每个槽都用一个从0开始的整数编号进行标识。
最初,哈希表中没有任何项,所以每个槽位都是空的。hashCode()
是 Object
类中的一个哈希函数,它返回一个整数(称为哈希值)。这个函数将一项映射到哈希表中的相应槽位。
hash = hashfunc(key)
index(索引)= hash % array_size
哈希函数将集合中的任意项映射到一个整数,该整数的范围在0到m-1之间(其中m是槽的数量)。
一旦哈希值计算完成后,我们可以将每个项目插入到哈希表的指定位置。当我们想要查找某个项目时,只需使用哈希函数计算该项目的槽位,然后在哈希表中查找该项目是否存在。这种查找操作的时间复杂度是 O(1),因为计算哈希值并索引到该位置所需的时间是固定的。只要一切就位,我们就得到了一个常量时间的查找算法。
碰撞(也可能称为冲突),当两个或多个项目试图占用同一个槽时,这将导致哈希技术出现问题。
HashMap和Hashtable有什么不同?
- HashMap 允许一个 null 键和任意数量的 null 值,而 Hashtable 不允许任何 null 键或 null 值。
- HashMap 不是同步的且线程安全的,而 Hashtable 是同步的且线程安全的。
- HashMap 的值可以通过迭代器进行遍历,而 HashTable 是除了 Vector 之外唯一使用 Enumerator 进行遍历的类。
- 由于 HashMap 不是同步的,因此它比 Hashtable 更快且占用更少的内存。在单线程环境中,非同步对象通常比同步对象(如 Hashtable)更好。
- HashMap 是 AbstractMap 类的子类,而 Hashtable 是 Dictionary 类的子类(该类在 JDK 1.7 中已经被废弃)。最好对外部同步 HashMap 或使用 ConcurrentMap 实现(如 ConcurrentHashMap)。虽然 Hashtable 和 HashMap 的父类不同,但它们都是 Map 抽象数据类型的实现。
- Java 5 引入了 ConcurrentHashMap,它作为 Hashtable 的替代品,在可扩展性方面优于 Hashtable。
HashMap 和 Hashtable 的相同点。
- HashMap 和 Hashtable 都不能保证映射的顺序固定不变。如果需要保持顺序,可以使用 LinkedHashMap。
- HashMap 和 Hashtable 都实现了 Map 接口的功能。
- 假设对象均匀分布在桶中,HashMap 和 Hashtable 的 put 和 get 方法都提供了常数时间性能。
- HashMap 和 Hashtable 都使用了哈希原则来工作。
#集合:地图指南
你知道你可以给最多50次鼓掌吗?
是的,50次鼓掌,是不是很酷?如果你觉得我的帖子有趣或对你有帮助,请点击 👏 这个鼓掌按钮并关注我,让更多人也能看到。你也可以在下面评论。
如果你喜欢读我的博客,能给我买杯咖啡就太好了,在这里支持我☕
不断学习,不断成长!
- Himanshu Shukla..
共同学习,写下你的评论
评论加载中...
作者其他优质文章