HashMap源码阅读分析(JDK1.8)

HashMap是JDK提供的经典容器之一,最近刚好时间充裕,于是自己看了一遍hashMap的源码实现,不同版本的JDK,HashMap的实现方式有所不同,本文主要针对JDK1.8的源码进行分析,至于各版本实现方式的不同,本文不做讨论,下面直接开始。

一、hash函数分析

map的put方法,首先调用的就是hash函数,返回key的hash值,其函数方法如下:

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

函数结构比较简单,但是我相信很多人看到这里是懵的,不知道函数这样处理的目的是什么,下面写了一个小demo来帮助大家理解这个函数。

执行结果如下:

上面的结果只是为了验证我的推导过程的正确性,用Integer.toBinaryString()这个函数可以得到一个10进制数的二进制有效位,因为位运算都是基于二进制的,所以说明中我进行了补全,其实一句话说明就是,这个hash函数获取的就是key的hashCode的值的二进制数及其自身无符号右移16位之后的值的异或运算后的结果,至于为什么要这么做,主要是为了将这个二进制数(32位)的低16位和高16位打乱,使其散列尽可能均匀。

备注:右移16位,相当于将32位的二进制数的高16位移动到低16位,高16位用0补齐,可以根据我给的例子观察出来。

二、HashMap的put()方法源码注释分析

上面的分析过程中,有两处用到了resize函数,一是table未初始化的时候,一是新增元素后,如果元素总数size大于threshold的时,下面详细分析下这个函数。

三、HashMap扩容函数resize()方法源码注释分析

三、HashMap的get()方法源码注释分析

以上就是HashMap几个重要函数的源码分析,当然还有比较棘手的红黑树的处理,下次再专门写一篇文章说明。

原文地址:https://www.cnblogs.com/green-technology/p/hash_map.html

时间: 2024-07-30 02:55:30

HashMap源码阅读分析(JDK1.8)的相关文章

ConcurrentHashMap 源码详细分析(JDK1.8)

ConcurrentHashMap 源码详细分析(JDK1.8) 1. 概述 <HashMap 源码详细分析(JDK1.8)>:https://segmentfault.com/a/1190000012926722 Java7 整个 ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全.所以很

HashMap 源码详细解析 (JDK1.8)

概要 HashMap 最早出现在 JDK 1.2 中,底层基于散列算法实现.HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0.HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化.另外,需要注意的是,HashMap 是非线程安全类,在多线程环境下可能会存在问题. HashMap 底层是基于散列算法实现,散列算法分为散列再探测和拉链式.HashMap 则使用了拉链式的散列算法,并在 JDK 1.8 中引入了红黑

HashMap源码阅读(2)- 碰撞(冲突)与扩容

上次在 HashMap源码阅读(1)- 初始值.数据结构.hash计算一文中描述了hashMap的初始大小,底层存储结构,以及哈希值计算和index计算,本文将接着上文,继续深入了解HashMap中hash碰撞和扩容问题 1)hash碰撞 谈hash,不得不提的当然是hash碰撞的问题,所谓hash碰撞,简单地说即由不同的key所计算出相同的hash值.笔者才疏学浅,所掌握的解决hash碰撞的方式有以下几种: 1.开放地址法: 当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测

HashMap源码阅读(1)- 初始值、数据结构、hash计算

最近有被问及HashMap的相关问题,不得不再阅读源码,刨根问底. 1)初始值 我们平常使用Map的时候,创建的时候都是Map<String,Object> map = new HashMap<String,Object>();那么HashMap的默认大小是多少呢?查看源码,发现这么一段: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** * The default initial capacity - MUST be a power of

HashMap 源码阅读

目录 HashMap 源码阅读 Map 接口 数据结构 initialCapacity 和 loadFactor hash() 方法 resize() 查找 getNode() 方法 遍历 fast-fail 和 modCount 新增和更新 putVal() 方法 putMapEntries() 方法 删除 removeNode() 方法 总结 HashMap 源码阅读 之前读过一些类的源码,近来发现都忘了,再读一遍整理记录一下.这次读的是 JDK 11 的代码,贴上来的源码会去掉大部分的注释

Java Jdk1.8 HashMap源码阅读笔记二

三.源码阅读 3.元素包含containsKey(Object key) /** * Returns <tt>true</tt> if this map contains a mapping for the * specified key. * * @param key The key whose presence in this map is to be tested * @return <tt>true</tt> if this map contains

Java Jdk1.8 HashMap源码阅读笔记一

最近在工作用到Map等一系列的集合,于是,想仔细看一下其具体实现. 一.结构 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 1.抽象类AbstractMap public abstract class AbstractMap<K,V> implements Map<K,V> 该类实现了Map接口,具体结

[java源码解析]对HashMap源码的分析(二)

上文我们讲了HashMap那骚骚的逻辑结构,这一篇我们来吹吹它的实现思想,也就是算法层面.有兴趣看下或者回顾上一篇HashMap逻辑层面的,可以看下HashMap源码解析(一).使用了哈希表得"拉链法". 我打算按这个顺序来讲HashMap:几个关键属性 -> 构造方法-> 存取元素方法 ->解决hash冲突方法->HashMap扩容问题. 4个关键属性: /** *HashMap的存储大小 */ transient int size; /** * HashMa

Java集合之HashMap源码实现分析...

1.简介 通过上面的一篇随笔我们知道了HashSet的底层是采用Map实现的,那么Map是什么?它的底层又是如何实现的呢?这下我们来分析下源码,看看具体的结构与实现.Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值.Map.Entry是其的内部类,描述Map中的按键/数值对.需要指出的是Map,允许null的键也允许null的值.它的实现主要有HashMap和sortedMap,其中SortedMap扩展了Map使按键保持升序排列,下面我们简要分析下HashMap的具体