博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashTable底层实现
阅读量:2428 次
发布时间:2019-05-10

本文共 1116 字,大约阅读时间需要 3 分钟。

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不会转换为红黑树

转载地址:http://thjmb.baihongyu.com/

你可能感兴趣的文章
小程序卡卡卡?用这个方法后,渲染速度提升三倍!
查看>>
二线城市容不下程序员
查看>>
不要成为自己讨厌的那种程序员 | 程序员有话说
查看>>
为什么程序员下班后只关显示器从不关电脑?
查看>>
滴滴裁员 2000 人,具体补偿方案已出
查看>>
余生,做个不焦虑的程序员!
查看>>
世界排名第 3 的滴滴裁员,开春求职必知的独角兽排行榜
查看>>
Spring Boot 中的响应式编程和 WebFlux 入门
查看>>
阿里终结裁员危机!坚决不拿 10 万阿里人祭天!
查看>>
如何从零开始两天撸一个微信小程序?!(内含源码)
查看>>
女神?御姐?文艺?这样的程序媛你绝没见过! | 程序员有话说
查看>>
“软件外包城”下的马鞍山 | 程序员有话说
查看>>
那些上相亲网站的程序员,后来怎么样了?
查看>>
程序员如何实现财富自由?
查看>>
你我的父母,都在被互联网“割韭菜”
查看>>
程序员下班后都忙些啥?| 程序员有话说
查看>>
网易不再从容
查看>>
万万没想到你们竟是这样的程序员 | 程序员有话说
查看>>
Java 帝国对 Python 的渗透能成功吗?
查看>>
从培训机构出来的程序员,后来都怎么样了? | 程序员有话说
查看>>