Java集合--08HashTable

本文深入探讨哈希表(Hashtable)的工作原理,包括其基于关键码值的直接访问特性,链地址法处理冲突的方式,以及与HashMap的区别。讨论了哈希表的线程安全性,不可变性(key和value不能为null),以及开散列法和闭散列法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hashtable基础

Hashtable叫哈希表或散列表,是根据关键码值(Key value)而直接进行访问的数据结构,采用的是数据结构中所说的链地址法处理冲突的方法 。

public class HashTable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable { }

(01)HashMap一样,Hashtable 也是一个散列表初始容量 11和 加载因子0.75,它存储的内容是键值对(key-value)映射,key-value都是存储在table数组中的。 (注意entry 数组里存值了,而传统hash 链表链地址法里没有存值)
(02)继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
(03)函数都是同步的,这意味着它是线程安全的,使用synchronized 。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

Hashtable优缺点

哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。

Hashtable 是非泛型的集合,元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和拆箱的操作,所以你可能需要进行一些类型转换的操作,而且对于int,float这些值类型还需要进行装箱等操作,非常耗时。

扩容时所有的数据需要重新进行散列计算(当rehash方法被调用以后,每一个键值对相应的index也会改变,也就等于将键值对重新排序了。虽然Hash具有O(1)的数据检索效率,但它空间开销却通常很大,是以空间换取时间。所以Hashtable适用于读取操作频繁,写入操作很少的操作类型。

总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。其他请参考HashMap

开散列法又叫链地址法(开链法)。 

    开散列法:首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。

开散列法有效的解决了数据溢出,不过需要增设链接指针,增加了存储的开销。但是,总体而言,效率还是快的多。

闭散列(即开放地址法)

    当发生哈希冲突时,如果该哈希表还没有被填满,那么就把该元素放到哈希表的下一个空闲的位置。

    优点:简单 易懂 
    缺点:一旦发生了哈希冲突,所有的冲突连接在一起,很容易产生数据”堆积”。即不同的数据占用可以利用的位置,就使得寻找其余数据的位置需要进行多次比较,就会导致查找的效率降低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值