`
messi_18
  • 浏览: 96413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读了HashMap源码的感受

    博客分类:
  • java
 
阅读更多
今天读了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的源码。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics