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对每 ...
随机推荐
- html image -- data:image/png;base64
1, data:image/png;base64 <!DOCTYPE HTML> <html> <head> <meta http-equiv=" ...
- Reflux 使用教程
Reflux是根据React的flux创建的单向数据流类库.Reflux的单向数据流模式主要由actions和stores组成.例如,当组件list新增item时,会调用actions的某个方法(如a ...
- Unity Layout碰撞检测
第一次看到LayerMask根本不知道是什么东东,后来问问度娘,看了几篇文章,终于看明白一点点,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Laye ...
- 【温故而知新】Tcp/Ip协议——总览
Tcp/Ip协议 一.概念 “三网”:即电信网络.有线电视网络和计算机网络 标准(Standards) 描述了协议的规定,设定了最简的性能集. 协议(Protocol) 网络设备用于交换信息的系列规则 ...
- margin四个属性的顺序
margin-top ,margin-right ,margin-bottom ,margin-left .方向为 上右下左,顺时针方向, 值可以是: 百分比(基于父对象总高度或宽度的百分比) 长度值 ...
- <httpRuntime>
1.在webconfig中httpconfig属性只能出现一次 配置httpRunTime也可以让FileUpload上传更大的文件,不过设置太大了会因用户将大量文件传递到该服务器而导致的拒绝服务攻击 ...
- Makefiles 介绍
http://www-personal.umich.edu/~ppannuto/writings/makefiles.html Makefiles Makefiles (or, the GNU aut ...
- ref 关键字out关键字
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- Spring 注入数据源
一.在项目中添加dataSource所用到的包 dbcp数据源所需包: commons-dbcp.jar commons-pool.jar C3P0数据源所需包: c3p0-0 ...
- L - 辗转相除法(第二季水)
Description The least common multiple (LCM) of a set of positive integers is the smallest positive i ...