java hash容器_java容器之HashMap源码分析

本篇所查看源码为jdk1.8源码

一、数组和散列表对比

数组数通过索引值直接找到value值

64f44d6f46cc894020d0d4c14b612a76.png数组

散列表不同在于,可以通过自定义的key值,找到对应的value值

散列表和数组的区别在于散列表是有映射关系存在的

5d8d88279e7eed44f678fbfd7d879bbb.png散列表

二、查看HashMap的继承关系

看一下HashMap的类,它会继承AbstractMap 实现Map接口,Cloneable,Serializable接口

75af74ea80e3f401b08d6c72a39d4090.png

抽象类AbstractMap会实现Map接口

568e69901d62b9a6124c0977cbc1cff5.png

这样我们就明白了,其实HashMap就是实现了Map接口,也就是实现了散列表的基础接口而已

现在看一下map接口,这个接口涉及到散列表的一些基本操作,比如散列表数据长度,插入数据,删除数据等

1fd3d6e46e01b0e47af063ff708a1860.png

但是有一点不太一样的地方,就是这个接口里面包含了一个内部接口

1aa8da7ff1859a8e48496840d4097646.png

在hashMap中,我们发现存在一个静态内部类是实现了这个接口

2abfea5e8a3f13f8cd9e513db1fcb182.png

这个node类超级简单,四个数据,分别是哈希、key值、value值,以及node域,因为key值会生成hash值,但是key值也是需要存储下来的,所有一同存到了Node对象里,hashMap就是用这个类存放节点数据的。

38a56f61d1aa5554edabdc7fd6656762.png

三、构造方法

1、无参构造函数,容量16,负载因子默认0.75

4f62f45a8f6851dcd2fd0e720a849ae9.png

2、带int参数构造函数,容量为传进来的值,负载因子默认0.75,会调用3方法

a9e2aee4714b5a88a45918606676dec1.png

3、带int参数构造函数,容量为传进来的值,负载因子为传进来的值

2b7e2368e5d56eca02a1cebbd604c78e.png

4、带Map实例构造函数

7b9e6e2cde4442301f8d25cd56958688.png

合并Map实例数据到当前的hashMap容器中

bdc8eebd8cc082f8c767bc51ab26847a.pngputMapEntries函数

tableSizeFor是为了返回大于输入参数且最近的2的整数次幂的数,这个当然是为了容器更好的性能,具体需要好好研究一下。

119754105a7a713e73feac1e8cc5493c.pngtableSizeFor函数

四、插入数据

插入数据分成了两张图,填上了对应的注释,hashmap是懒加载的,所以这首次添加数据就会涉及到扩容操作,扩容方法为resize()

ea0df4b5c08694f79b17782cb9f030ad.pngputVal 图一

61e615d3b279365fb844cbf390dfcc4c.pngputVal 图二

resize()扩容方法

分成了三张图

54303fb22feb7cdd467f36d22da9d511.png自动扩容 图一

c6d22ea4c402be590229dbeca6a1f93f.png自动扩容 图二

b467b32c764e4e424b2208d52e4fbb62.png自动扩容 图三

五、删除数据

删除数据和新增数据代码很像,这个会涉及到红黑树的数量过少时转链表的操作

b303968dc69dfe645b31960e30b604cb.pngremove方法

ed4b9ffc97557d50ee7551f039caa803.png删除方法 图一

ae13d0f42c167abdb4e45c63a0ab2323.png删除方法 图二

六、清空容器

清空方法很简单,将哈希桶数据置为null,真实数据由gc程序进行回收

d210c7d02adfc71830e8977fdca5d58d.png

a20a5301dcf162ad07ce38a1cb3746ce.png

2125da67030763d2ddec671a4b4641a5.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值