HashTable底层实现

HashTable是继承与Dictionary类,实现了Map接口,HashTable的主体还是Entry数组
在这里插入图片描述
HashTable的默认容量大小为11,负载因子为0.75
在这里插入图片描述

HashTable的主要方法的源码实现逻辑,与HashMap中非常相似,有一点重大区别就是所有的操作都是通过synchronized锁保护实现的,只有获得了对应的锁,才能进行后续的读写操作

put()方法

我们可以看到,HashTable的put方法使用synchronized修饰,也就是说当使用put方法时,必须要获取HashTable对象的锁
在这里插入图片描述
而且我们需要注意的一点是:当Value值为空时,HashTable直接抛出异常,说明HashTable不允许存储空值
接着通过key的hashcode获取数组的下标(在hashmap中,是通过扰动函数来先获取一个hash值,然后通过index=hash&(length-1)获取下标),接着会寻找该位置是否存在该值,如果存在,则用插入的值替换,返回该值
在这里插入图片描述
如果要插入的值在HashTable中不存在,则进行addEntry操作:
在这里插入图片描述

addEntry()方法

首先判断数组中元素个数是否已经超过了负载容量,如果等于负载容量,则进行扩容操作,然后重新计算下标,在进行插入操作
在这里插入图片描述

reHash()方法

HashTable的扩容是:扩大两倍加一,理由是:HashTable中的数组长度尽量为素数或者奇数,同时HashTable采用取模的方式来计算数组下标,这样减少了Hash碰撞,计算出来的数组下标更加均匀。但是这样效率会比HashMap利用位运算计算数组下标低
在这里插入图片描述
HashTable采用头插法的方式迁移数组,相比较HashMap的尾插法来说效率更高
在这里插入图片描述

get()方法

get()方法就是链表的查找问题
在这里插入图片描述

HashMap和HashTable的区别

  • HashMap是非线程安全的,在多线程环境下,HashMap会产生线程安全问题;而HashTable中的大部分方法都使用synchronized关键字来确保线程同步,因此HashTable是线程安全的,不过性能要比HashMap低一些
  • HashMap的key可以使用null(但只能有一个),value可以为null,而HashTable都不允许存储key和value值为空的元素
  • HashMap继承了AbstractMap,HashTable继承了Dictionary抽象类,两者都实现了Map接口
  • HashMap的初始容量为16,HashTable的初始容量为11
  • HashMap的扩容机制为扩容两倍,而HashTable的扩容机制为两倍-1
  • HashTable不会转换为红黑树
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值