为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的Hashtable详解:哈希表指南第四部分

什么是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..

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消