HasMap
|
锁定老帖子 主题:深入理解HashMap
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
发表时间:2009-12-02 最后修改:2010-05-16
/** *@author annegu *@date 2009-12-02 */
上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。 当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。从hashmap中get元素时,首先计算key的hashcode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。从这里我们可以想象得到,如果每个位置上的链表只有一个元素,那么hashmap的get效率将是最高的,但是理想总是美好的,现实总是有困难需要我们去克服,哈哈~
首先算得key得hashcode值,然后跟数组的长度-1做一次“与”运算(&)。看上去很简单,其实比较有玄机。比如数组的长度是2的4次方,那么hashcode就会和2的4次方-1做“与”运算。很多人都有这个疑问,为什么hashmap的数组初始化大小都是2的次方大小时,hashmap的效率最高,我以2的4次方举例,来解释一下为什么数组大小为2的幂时hashmap访问的性能最高。
3、hashmap的resize 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
| 返回顶楼 | |
|
发表时间:2009-12-03
当length=2^n时,hashcode & (length-1) == hashcode % length,难怪这么巧
|
| 返回顶楼 | |
|
发表时间:2009-12-03
写的很好。
不过,以前学数据结构的时候都学过。 |
| 返回顶楼 | |
|
发表时间:2009-12-03
mycybyb 写道
写的很好。
不过,以前学数据结构的时候都学过。 楼上应该没有看楼主的这篇文章,数据结构中应该不会有JDK中map的hash函数的实现说明,而楼主详细的分析了jdk中的hashmap中hash函数真正的原理和价值所在,网上HashMap的文章一堆一堆的,但是没有人能说清楚h&length-1的奥妙所在 |
| 返回顶楼 | |
|
发表时间:2009-12-03 最后修改:2009-12-03
火星来客 写道
mycybyb 写道
写的很好。
不过,以前学数据结构的时候都学过。 楼上应该没有看楼主的这篇文章,数据结构中应该不会有JDK中map的hash函数的实现说明,而楼主详细的分析了jdk中的hashmap中hash函数真正的原理和价值所在,网上HashMap的文章一堆一堆的,但是没有人能说清楚h&length-1的奥妙所在 没看能说好吗? 我说写的很好,说的就是h & length -1这个。 其他的,都是常识了。 |
| 返回顶楼 | |
|
发表时间:2009-12-03 最后修改:2009-12-03
mycybyb 写道
火星来客 写道
mycybyb 写道
写的很好。
不过,以前学数据结构的时候都学过。 楼上应该没有看楼主的这篇文章,数据结构中应该不会有JDK中map的hash函数的实现说明,而楼主详细的分析了jdk中的hashmap中hash函数真正的原理和价值所在,网上HashMap的文章一堆一堆的,但是没有人能说清楚h&length-1的奥妙所在 没看能说好吗? 我说写的很好,说的就是h & length -1这个。 其他的,都是常识了。 恩,同意,其他确实是常识,只是从我的面试结果来看,没有常识的程序员比较多。 |
| 返回顶楼 | |
|
发表时间:2009-12-03
火星来客 写道
mycybyb 写道
写的很好。
不过,以前学数据结构的时候都学过。 楼上应该没有看楼主的这篇文章,数据结构中应该不会有JDK中map的hash函数的实现说明,而楼主详细的分析了jdk中的hashmap中hash函数真正的原理和价值所在,网上HashMap的文章一堆一堆的,但是没有人能说清楚h&length-1的奥妙所在 h&length-1,这个也算是常识吧,对数学或者位运算了解点就知道了。 |
| 返回顶楼 | |
|
发表时间:2009-12-03 最后修改:2009-12-03
dennis_zane 写道
h&length-1,这个也算是常识吧,对数学或者位运算了解点就知道了。
&运算本身当然是常识,任何一本计算机图书中几乎都会提到,但是将其和:
组合起来使用,得到%的效果,但是性能比%高,这一点我没有想到,所以这一点上对我个人来说没有将其视为常识。 |
| 返回顶楼 | |
|
发表时间:2009-12-03
|
| 返回顶楼 | |
|
发表时间:2009-12-03
很不错!!
|
| 返回顶楼 | |
HasMap的更多相关文章
- JS HasMap使用
function HashMap() { var size = 0; var entry = new Object(); this.put = function (key, value) { entr ...
- map和hasmap的区别
MAP接口的定义如下: public interface MAP< k , v> Key 到value 的映射 ,Key不允许重复,每一个key只能映射一个value . Has ...
- java hasmap对象的深复制实现:字节码复制和对象序列化成字符串复制比较。
/** * Created by Administrator on 2016/11/23. */ public class test { public static void main(String[ ...
- 集合--Map&&HasMap和TreeMap
特点:以键值对key,value方式存储的结构 key:Set集合 key能重复,无序的,如果重复,后面的key会把前面的覆盖掉(key必须是唯一的,不唯一,那么后面的value会把前面的va ...
- hasmap hashtable
hashMap和hashtable方面的知识点吧: 1. 关于HashMap的一些说法: a) HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体.HashMa ...
- HashMap和HashTable到底哪不同?
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案. 代码版本 JDK每一版本都在改进.本文讨论的Has ...
- [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板
引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate) 切换模板的两种方式: 使用DataTemplateSelecto ...
- Spring系列之谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- android学习之ListView
移通152余继彪 该组件用于显示列表的view 包含了三个关键元素 listView 适配器 以及数据,适配器主要是用于将数据映射到listview,适配器数据主要是有hasmap 配合list对每 ...
随机推荐
- H5单页面架构:自定义路由 + requirejs + zepto + underscore
angular优点: 强大的数据双向绑定 View界面层组件化 内置的强大服务(例如表单校验) 路由简单 angular缺点: 引入的js较大,对移动端来说有点吃不消 语法复杂,学习成本高 backb ...
- 简述uwsgi使用一个服务启动多个文件的用法
[场景篇] 为了节省端口的占用,将N个flask应用服务——每个对应一个文件(web.py.django也一样)合并为一个端口服务来启用 [寻思篇] 通常的做法:每个文件配置一个xml 或者 ini文 ...
- C# 坦克大战学习总结
1.学会用Resource管理资源 添加资源 在properties下的Resource.resx添加资源 使用资源 工程名.Properties.Resource.资源名 实际本质,是一个流. 2. ...
- stagefright框架(一)Video Playback的流程
在Android上,預設的多媒體框架(multimedia framework)是OpenCORE. OpenCORE的優點是兼顧了跨平台的移植性,而且已經過多方驗證,所以相對來說較為穩定:但是其缺點 ...
- C# 关于out关键字的用法(一个方法返回多个值的问题)
通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回去.这个时候我们就要用到out关键字. 如果用ref也可以解决,但是用ref需要 ...
- 追加addclass和removeclass
//addclass Base.prototype.addclass=function(classname){ for(var i=0;i< ...
- 【转】Java与C#语言级比较
原文链接:http://www.harding.edu/fmccown/java_csharp_comparison.html Java 程序结构 C# package hello;public cl ...
- SpringMVC+JPA+Hibernate配置
首先,Spring配置文件 <?xml version="1.0" encoding="UTF-8"?><beans xmlns=" ...
- redis 未授权漏洞利用直接登录服务器
在没有查到杀手之前我是先把带宽&端口用iptables 做了限制这样能保证我能远程操作服务器才能查找原因 2 在各种netstat –ntlp 的查看下没有任何异常 在top 下查到了有异常 ...
- 播放器音乐源之天天动听API
搜索歌曲API:http://so.ard.iyyin.com/s/song_with_out?q={0}&page={1}&size={2} {0}=需要搜索的歌曲或歌手 {1}=查 ...






资深会员
