锁定老帖子 主题:深入理解HashMap
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-03
cwx714 写道 看完收获很大!请问annegu是男是女?
女睐 |
|
返回顶楼 | |
发表时间:2009-12-03
讲得很透彻
|
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2009-12-03
我靠,MM?
|
|
返回顶楼 | |
发表时间: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的问题。 |
|
返回顶楼 | |
发表时间:2009-12-03
写的不错,也比较深入,期待下文!
|
|
返回顶楼 | |
发表时间:2009-12-03
lz写的很详细,
让我想起了以前面试的时候被问到过关于hashmap内部实现的问题,当时差点蒙了,回来后特意花了点功夫看了几个集合类的源码呢! |
|
返回顶楼 | |
发表时间:2009-12-03
回帖 回答了n遍的选择题 终于可以拉
以前在学校的时候看了下源代码 没有深入的理解只是结合课本 觉得可以怎么实现 读了楼主的帖子后发现细节的东西更加的重要 |
|
返回顶楼 | |
发表时间:2009-12-03
总的来说就是HashMap采用数组链式结构,使用key的hashCode()方法得到hash code,调用indexFor()获取index,再根据key的equals()方法找到value。
|
|
返回顶楼 | |
发表时间:2009-12-03
阅读了annegu的几篇精华文章,有很多代码的阅读总结文章。写得很好,很流畅。在代码的阅读过程中确实能够学到很多好的开发策略,设计思想。对个人能力提升有很大作用。我平时就是不怎么喜欢阅读代码,只喜欢快速掌握工具的使用,使用着幽雅封装的同时很少去研读优秀框架的实现。这是不对的!以后要养成这方面的习惯。annegu加油!
|
|
返回顶楼 | |