散列表HashTable、HashMap的常见问题及底层(源码分析)

本文深入探讨了哈希表,包括使用拉链法解决Hash冲突,散列表的扩容机制,如何构造合适的hash函数确保均匀分布。对比了HashTable与HashMap的区别,强调了线程安全和时间复杂度。Java8中HashMap引入红黑树进一步优化了查找性能。

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

散列表(HashTable、HashMap)

         散列表,也称哈希表(HashTable)是一种数组+链表的数据结构(拉链法),解决hash冲突。

         Hash冲突:key-value的结构,key的hash值可能会相同产生冲突(不能放在同一个数组位置上)

         所以用拉链法放将冲突到链表里,为了保证哈希表查找容易,希望链表不要太长,冲突分布均匀

         常用取余法(key mod p,  p取素数为好),使hash值均匀分布。

1、拉链法  解决hash冲突

引用:https://blog.youkuaiyun.com/donghejk/article/details/83781932

      拉链法:加链表、放冲突。拉链法查找分为两步,首先是根据散列值(hash值)找到放冲突的链表,然后沿着链表顺序找到相应的键。

散列地址是链表的头结点,期望数组可以足够大(扩容问题),链表可以足够小(均匀分布问题),这样查找效率高。

 

2、散列表如何扩容

       数组是无法自动扩容的,达到阈值后,使用一个新的数组代替已有的容量小的数组。Hashtable的扩容方法rehash:

//hashtable的扩容
protected void rehash() {
        int oldCapacity = table.length;
        Entry<?,?>[] oldMap = table;

        // overflow-conscio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值