HashMap中如何根据key算出元素的存储位置

本文详细解析了JDK7中HashMap的数据结构,包括其核心算法hash和indexFor方法。hash方法用于将Object类型转换为整型,而indexFor方法则通过位运算将hash值转化为数组下标,优化了效率。

JDK7中,根据Object类型的key计算出其在数组中的下标位置,HashMap的数据结构是数组+链表。由2个方法hash(Object key)和indexFor(int h,int length)来实现。

hash :该方法主要是将Object转换成一个整型。
indexFor :该方法主要是将hash生成的整型转换成链表数组中的下标。

static int indexFor(int h, int length) {
    return h & (length-1);
}

indexFor方法其实主要是将hashcode换成链表数组中的下标。h表示元素的hashcode值,length就是HashMap的容量。h & (length-1)其实就是h对length进行取模,之所以换成位运算,是出于效率问题考虑。使用位运算代替了取模运算。之所以可以做等价代替,前提是要求HashMap的容量一定要是2^n

HashMap源码解析说明(请进行中文解析相关的概念和描述):HashMap在JDK1.8以前数据结构和存储原理   1)链表散列:通过数组和链表结合在一起使用,就叫做链表散列。如下        2)HashMap的数据结构和存储原理     HashMap的数据结构是链表散列。那HashMap底层是怎么样使用这个数据结构进行数据存取的呢?分成两个部分:     第一步:HashMap内部有一个entry的内部类,其中有四个属性,我们要存储一个值,则需要一个key一个value,存到map中就会先将key和value保存在这个Entry类创建的对象中。      static class Entry<K,V> implements Map.Entry<K,V> {      final K key; //就是我们说的map的key      V value; //value值,这两个都不陌生      Entry<K,V> next;//指向下一个entry对象      int hash;//通过key算过来的你hashcode值。     Entry的物理模型图:              第二步:构造好了entry对象,然后将该对象放入数组中,如何存放就是这hashMap的精华所在了。       大概的一个存放过程是:通过entry对象中的hash值来确定将该对象存放在数组中的哪个位置上,如果在这个位置上还有其他元素,则通过链表来存储这个元素。          3)Hash存放元素的过程     通过key、value封装成一个entry对象,然后通过key的值来计算该entry的hash值,通过entry的hash值和数组的长度length来计算出entry放在数组中的哪个位置上面,     每次存放都是将entry放在第一个位置。在这个过程中,就是通过hash值来确定将该对象存放在数组中的哪个位置上。
最新发布
04-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值