论坛首页 Java企业应用论坛

深入理解HashMap

浏览 130372 次
该帖已经被评为精华帖
作者 正文
   发表时间:2009-12-03  
cwx714 写道
看完收获很大!请问annegu是男是女?

女睐
0 请登录后投票
   发表时间:2009-12-03  
讲得很透彻
0 请登录后投票
   发表时间:2009-12-03  
引用

         那么hashmap什么时候进行扩容呢?当hashmap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能,比如说我们有1000个元素要放到hashmap中,那么将hashmap的size设置为 1024是一个比较好的选择,不过上面annegu已经说过,即使是1000,hashmap也自动会将其设置为1024。


按照loadFactor=0.75,那么1024*0.75=768 < 1000,所以如果要存储1000个元素,应该设置初始大小为2048吧?否则,hashmap会自动resize。
1 请登录后投票
   发表时间:2009-12-03  
我靠,MM?
0 请登录后投票
   发表时间:2009-12-03   最后修改:2009-12-03
myreligion 写道
引用

         那么hashmap什么时候进行扩容呢?当hashmap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能,比如说我们有1000个元素要放到hashmap中,那么将hashmap的size设置为 1024是一个比较好的选择,不过上面annegu已经说过,即使是1000,hashmap也自动会将其设置为1024。


按照loadFactor=0.75,那么1024*0.75=768 < 1000,所以如果要存储1000个元素,应该设置初始大小为2048吧?否则,hashmap会自动resize。


谢谢你,呵呵,很细心!我已经修改了,如下:

比如说,我们有1000个元素new HashMap(1000), 但是理论上来讲new HashMap(1024)更合适,不过上面annegu已经说过,即使是1000,hashmap也自动会将其设置为1024。
但是new HashMap(1024)还不是更合适的,因为0.75*1000 < 1000, 也就是说为了让0.75 * size > 1000, 我们必须这样new HashMap(2048)才最合适,既考虑了&的问题,也避免了resize的问题。


0 请登录后投票
   发表时间:2009-12-03  
写的不错,也比较深入,期待下文!
0 请登录后投票
   发表时间:2009-12-03  
lz写的很详细,
让我想起了以前面试的时候被问到过关于hashmap内部实现的问题,当时差点蒙了,回来后特意花了点功夫看了几个集合类的源码呢!
0 请登录后投票
   发表时间:2009-12-03  
回帖 回答了n遍的选择题 终于可以拉

以前在学校的时候看了下源代码  没有深入的理解只是结合课本  觉得可以怎么实现  读了楼主的帖子后发现细节的东西更加的重要
0 请登录后投票
   发表时间:2009-12-03  
总的来说就是HashMap采用数组链式结构,使用key的hashCode()方法得到hash code,调用indexFor()获取index,再根据key的equals()方法找到value。
0 请登录后投票
   发表时间:2009-12-03  
阅读了annegu的几篇精华文章,有很多代码的阅读总结文章。写得很好,很流畅。在代码的阅读过程中确实能够学到很多好的开发策略,设计思想。对个人能力提升有很大作用。我平时就是不怎么喜欢阅读代码,只喜欢快速掌握工具的使用,使用着幽雅封装的同时很少去研读优秀框架的实现。这是不对的!以后要养成这方面的习惯。annegu加油!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics