首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HashMap解析

HashMap即是采用了链地址法,也就是数组+链表的方式。 HashMap的结构 HashMap的主干是一个Entry数组。...transient Entry[] table = (Entry[]) EMPTY_TABLE; Entry是HashMap中的一个静态内部类,它实现了一个链表结构。...由于HashMap非线程安全,在对HashMap进行迭代时,如果期间其他线程的参与导致HashMap的结构发生变化了(比如put,remove等操作),在迭代过程中,判断modCount跟expectedModCount...是否相等,如果不相等就表示已经有其他线程修改了Map,则需要抛出异常ConcurrentModificationException HashMap的扩容 HashMap数组的大小需要扩容时,原数组中的数据必须重新计算其在新数组中的位置...默认情况下,数组大小为16,那么当HashMap中元素个数超过160.75=12的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置。

62530
您找到你想要的搜索结果了吗?
是的
没有找到

HashMap源码解析

答案一定是有的,因为你能想到,那么创造Java的大师们早就想到了,于是HashMap集合诞生了,既然HashMap集合的出现是为了解决底层数组和双链表的缺点,那么可想而知HashMap集合底层一定不是采用数组或双链表实现的...下面我们通过HashMap的源码来分析HashMap底层散列表的具体的实现。我们还是和其它集合一样,先来看一下HashMap的实例化。 ?...上面代码为无参的HashMap构造方法,构造方法中设置了当前HashMap的加载因子为默认值也就是0.75。也可以自行修改此默认值,在HashMap中提供了修改此参数的构造方法。...下面我们看HashMap的put方法的底层实现,put方法是HashMap中最重要的方法,几乎涉及到HashMap中的所有的知识点。如底层的初始化、再散列、散列冲突等。 ? ? ? ? ?...我们发现在HashMap源码中并没有发现同步关键字synchronized,这就说明,HashMap并不是线程安全的集合类,所以在使用时,要特别注意 下面我们回到文章开头所说的问题,在HashMap是怎么解决数组和双链表的性能问题的呢

54910

HashMap 源码解析

简介 HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。...HashMap 并不保证键值对的顺序,这意味着在进行某些操作后,键值对的顺序可能会发生变化。另外,需要注意的是,HashMap 是非线程安全类,在多线程环境下可能会存在问题。...方法解析 构造函数 HashMap 的构造方法不多,只有四个。HashMap 构造方法做的事情比较简单,一般都是初始化一些重要变量,比如 loadFactor 和 threshold。...HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。...遍历HashMap的过程就是从头查找HashMap数组中的不为空的结点,如果该结点下存在链表,则遍历该链表,遍历完链表后再找HashMap数组中下一个不为空的结点,以此进行下去直到遍历结束。

63111

HashMap源码解析

转载请以链接形式标明出处: 本文出自:103style的博客 base on jdk_1.8.0_77 目录 HashMap的常量介绍 HashMap的构造函数 HashMap的数据操作函数...TreeNode介绍 参考文章 HashMap的常量介绍 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 初始化默认的容量...HashMap的loadFactor为什么是0.75? static final int TREEIFY_THRESHOLD = 8; 链表转化为树的阈值 。...: 插入位置无数据,直接存入当前的key在table的位置 插入位置有数据,但是较少且符合链表结构存储的条件,那么以链表操作存入 插入位置有数据,但是以树结构进行存储,那么以树的相关操作进行存入 源码解析...源码分析 Java中HashMap的实现原理 HashMap defaultLoadFactor = 0.75和泊松分布没有关系 HashMap的loadFactor为什么是0.75?

28650

HashMap扩容机制解析

扩容时机 第一种情况:当HashMap第一次调用put方法时。 第二种情况:当存储在HashMap中元素的实际长度大于扩容临界值时。 什么是存储在HashMap中元素的实际长度?...实际以键值对形式存储在HashMap中的Node,而不是HashMap中底层数组被使用的长度,两者完全不相同。...由于方法比较长,所以这里分段解析。 // 底层数组 Node[] oldTab = table; // 当前底层数组长度 int oldCap = (oldTab == null) ?...* 第一次扩容在上一篇中解析过,可移步上一篇,这里不多解析了 */ else { // zero initial threshold signifies using defaults newCap...至此HashMap的扩容机制解析完毕,有兴趣的各位可以使用下面代码打断点进行debug查看扩容流程。

21110

HashMap的源码解析

前言 今天学习了基于JDK1.8的HashMap的源码,主要从如下几个方面来阐述,HashMap的数据结构,HashMap如何支持动态扩容,HashMap的散列函数是如何实现的,并且如何防止散列冲突,...最后就是对HashMap的常用方法的源码解析。...目录 HashMap的数据结构 HashMap的散列函数 散列冲突的处理 HashMap的扩容机制 put 方法的源码解析 get 方法和remove的源码解析 基本的全局常量 默认初始化的容器大小16...get方法的源码解析 get方法是根据传入的key,从HashMap中取出相应的value。如果找不到则返回null,能找到的话则返回找到的value。...= null); } } return null; } remove方法的源码解析 remove 方法可以移除指定的key的元素。

49960

HashMap源码解析(一)

HashMap是面试中经常被问到的一个问题,不管是初级还是中级以及高级,都会问到,只不过深度不一样,今天我们就详细解析一下HashMap的源码,为了大家能碎片时间看完,我们分为多篇文章解析,首先从1.7JDK...版本开始解析, 基本概念我且以为大家都知道,那么我们开始1.7JDK的源码看起,下图就是HashMap数据结构 put方法 public V put(K key, V value) {...h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } //这里使用与运算,性能会更好,且hashMap...hash函数是为了尽可能的均匀分布,减少hash冲突,其中就是想保留高位和低位,然后高位和低位进行与运算,而indexFor是为了计算数组下标即实际的存储位置,使用与位运算是为了更高的性能 这里为什么HashMap

24810

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券