读了HashMap源码的感受

今天读了java.util.HashMap的源码,记录几点感受。起因是想知道,HashMap是如何实现的,最大可以容纳多少键值对。因为HashMap实现了Map接口,而Map接口扩展自Collection接口,所以HashMap也实现了size方法。size方法的返回值是int型的,所以,最多就能返回Integer.MAX_VALUE个结果。但是,并不意味着HashMap只能容纳这么多。这就涉及到HashMap是如何实现的。

HashMap内部有一个Entry的数组,就是所谓的bucket。每个bucket都是一个链表。链表中的元素就是键值对Entry。所以,理论上说HashMap可以容纳无限的键值对。但是最多就只能返回Integer.MAX_VALUE个。

接下来,说一下HashMap的优缺点:
优点:get和put的操作都是常数时间。
缺点:bucket的容量是动态增加的,每次容量调整,都会把原来的元素rehash并且复制到新的数组上面去,开销不小。

size,capacity,threshold,loadFactor之间的关系:
size是键值对的个数
capacity是buckets的个数
loadFactor是个参数,描述buckets的充满程度
threshold等于capacity*loadFactor,是一个阀值。如果size超过了它就要增加capacity(变为原来的2倍),并且rehash。

rehash的细节:
先创建一个长度为新长度的Entry数组作为buckets,然后,用它的长度rehash原来buckets中的所有Entry,并把Entry插入到新的buckets中。注意是插入而不是append到相应的bucket中:如果该bucket中已有Entry,就插入到那个entry的前面。

与Hashtable的区别:
HashMap是非线程安全的,而Hashtable是线程安全的
HashMap的key和value可以是null,而Hashtable不能接受null为key(null value待确认)

那么null的键hash到哪个bucket呢?就是指定bucket[0].

明天读下,Hashtable的源码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值