HashMap源码阅读(小白的java进阶)】的更多相关文章

OverView 构造方法 //构造方法 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapaci…
ArrayList(线程不安全) ArrayList是一个其容量能够动态增长的动态数组 继承关系 构造方法 是符合collection父接口的规范的 //传0则设置为默认容量 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.element…
HashMap源码阅读笔记 本文在此博客的内容上进行了部分修改,旨在加深笔者对HashMap的理解,暂不讨论红黑树相关逻辑 概述   HashMap作为经常使用到的类,大多时候都是只知道大概原理,比如底层是由数组+链表+红黑树实现,使用HashMap存储自定义类时需要重写其hashCode和equals方法等等--但对其具体如何实现却知之甚少,本文将作为类似笔记的形式记录笔者的源码阅读方式.(在JDK 1.7及其之前由数组加链表组成,正常情况想我们谈论的均为JDK 1.8及其之后的HashMap…
目录 1.关键的几个static参数 2.内部类定义Node节点 3.成员变量 4.静态方法 5.HashMap的四个构造方法 6.put方法 7.扩容resize方法 8.get方法 9.remove操作 10.参考链接 HashMap在JDK 1.7的时候,底层的实现机制是数组+链表,利用链表来解决哈希冲突.链表的查找复杂度是O(n),如果链表很长的话,查找的时间是比较大的,所以在JDK 1.8对HashMap做了优化,其底层的实现机制变成了数组+链表+红黑树.当链表的长度超过某个阈值,就会…
目录结构 导入语 HashMap构造方法 put()方法解析 addEntry()方法解析 get()方法解析 remove()解析 HashMap如何进行遍历 一.导入语 HashMap是我们最常见也是最长使用的数据结构之一,它的功能强大.用处广泛.而且也是面试常见的考查知识点.常见问题可能有HashMap存储结构是什么样的?HashMap如何放入键值对.如何获取键值对应的值以及如何删除一个键值对.今天我们就来看看HashMap底层的实现原理.下面我们就开始进入正题,分析一下hashmap源码…
序 阅读java源码可能是每一个java程序员的必修课,只有知其所以然,才能更好的使用java,写出更优美的程序,阅读java源码也为我们后面阅读java框架的源码打下了基础.阅读源代码其实就像再看一篇长篇推理小说一样,不能急于求成,需要慢慢品味才行.这一系列的文章,记录了我阅读源码的收获与思路,读者也可以借鉴一下,也仅仅是借鉴,问渠那得清如许,绝知此事要躬行!要想真正的成为大神,还是需要自己亲身去阅读源码而不是看几篇分析源码的博客就可以的. 正文 HashMap是我们经常用的的一个集合类,其中…
HashMap是Map家族中使用频度最高的一个,下文主要结合源码来讲解HashMap的工作原理. 1. 数据结构 HashMap的数据结构主要由数组+链表+红黑树(JDK1.8后新增)组成,如下图所示: 左侧数组是哈希表,数组的每个元素都是一个单链表的头节点,当不同的key映射到数组的同一位置,就将其放入单链表中来解决key的hash值的冲突. 当链表的长度>8时,JDK1.8做了数据结构的优化,会将链表转化为红黑树,利用红黑树快速增删改查的特点提升HashMap的性能,查询效率链表O(N),红…
1.HashMap概述: HashMap是基于Map接口的一个非同步实现,此实现提供key-value形式的数据映射,支持null值. HashMap的常量和重要变量如下: DEFAULT_INITIAL_CAPACITY = 16 Node数组的默认长度 MAXIMUM_CAPACITY = 1073741824 Node数组的最大长度 DEFAULT_LOAD_FACTOR = 0.75F 负载因子,调控控件与冲突率的因数 TREEIFY_THRESHOLD = 8 链表转换为树的阈值,超过…
前言 之前读过一些类的源码,近来发现都忘了,再读一遍整理记录一下.这次读的是 JDK 11 的代码,贴上来的源码会去掉大部分的注释, 也会加上一些自己的理解. Map 接口 这里提一下 Map 接口与1.8相比 Map接口又新增了几个方法: 这些方法都是包私有的static方法: of()方法分别返回包含 0 - 9 个键值对的不可修改的Map: ofEntries()方法返回包含从给定的entries总提取出来的键值对的不可修改的* Map(不会包含给定的entries): entry()方法…
hashcode() 与 equals() 应一起重写,在HashMap 会先调用hash(key.hashcode()) 找到对应的entry数组位置 (一般初始是16,2^x,rehash后会翻倍),再在这个entry链表上equals判断是否存在相同元素. 所以当重写equals时没保证hashcode出的值的一致性,会导致hash到不同的数组位置 插入重复的元素. ※String类的hashcode是通过各个位置的char的ascii码计算Σx*31^(len-i)得到的※ HashSe…