首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏学习计划

    JDK 8 HashMap源码解读

    开始进入HashMap前,先了解一下知识,这样才能更好的理解源码源码 红黑树源码 上边我们从原理和实例上了解了红黑树,现在从源码级别来看看他的一个流程,HashMap的插入有使用到红黑树,所以,了解了红黑树,再去看效果会更好。 HashMap 源码 JDK7和8有这样一些区别: 在hash上的计算,8 的没有7 的复杂,原因可能就是在8里面引入了红黑树,已经将插入读取的效率提高了,再在下标上下功夫没有多大用处了。 h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } jdk8: static final int 0 : (h = key.hashCode()) ^ (h >>> 16); } 8里的内部数组数组类型是Node,7里面是Entry 8里面链表是尾插法,7是头插法 final V

    51020发布于 2021-01-29
  • 来自专栏学习计划

    JDK 8 ConcurrentHashMap源码解读

    7和8 的结构还是有些不一样;7里面是Segment、entry数组实现的,将entry数组分段加锁,而8里是对数组元素加锁,并发上增加了一个counterCells的数组记录并发时增加的值,然后通过cas 方式进行操作,性能比起整段锁住的JDK 7 好了很多。 sizeCtl = sc; } break; } } return tab; } jdk8

    41110发布于 2021-01-29
  • 来自专栏关忆北.

    源码JDK8 StringJoiner

    其value是StringBuilder类型,所以单纯看StringJoniner的属性变量就非常适合做字符串的拼接、分割。

    39320编辑于 2021-12-07
  • 来自专栏奕仁专栏

    jdk8HashMap源码解读一【源码

    hash; //hash值 key; //键 value; //值 node next; //用于指向链表的下一层(产生冲突,用拉链法) } 以下是具体的 put 过程(JDK1.8 p.next = newNode(hash, key, value, null); // TREEIFY_THRESHOLD 为 8, 如果没有碰撞,直接放入桶中(碰撞的意思是计算得到的 Hash 值相同,需要放到同一个 bucket 中) 如果碰撞了,以链表的方式链接到后面 如果链表长度超过阀值(TREEIFY THRESHOLD==8

    59210发布于 2020-04-20
  • 来自专栏程序员升级之路

    Centos编译JDK8源码

    1、准备环境 因为内核是用C++编写的,因此需要GCC,我开发机版本为8.1.0; make为3.8.1,本来装了个较新为4.2的版本,也不行,换成3.8.1才好; JDK 这个可能要注意,因为整个JDK 源代码只有JVM等核心代码是用C/C++编写,一些类库还是Java编写的,最后需要编译为class文件,这部分的工作需要另外一个JDK来编译;网上说编译8JDK要用1.7的,我用1.8的也可以编译通过 libXrender-devel libXrandr-devel libXi-devel yum -y install cups-devel yum -y install alsa-lib-devel 2、下载源码 hg下载命令 hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u 3、编译 3.1、先进入到源代码根目录 cd jdk8u 3.2、然后下载源代码 函数: break jdk/src/share/bin/main.c:97 接下来就可以开始在jdk源代码中遨游了。

    1.3K10发布于 2020-09-22
  • 来自专栏码云大作战

    HashMap源码分析 - jdk8

    这篇文章主要是根据JDK8的HashMap来进行分析。 可以看到这里扩容的扩展和jdk7相比少了很多计算的过程。 afterNodeRemoval(node); return node; } } return null; } 二、HashMap总结 JDK8源码中我也分析了什么时候会采用数组+链表,什么时候采用数组+红黑树的情况。根据是根据2个关键阈值参数,并不只是链表长度大于8时就会转换为红黑树。如果当map中数组下标小于64时会优先扩容。 这里6和8我没有深入了解,应该是保证时间和空间最好的权衡。

    60910发布于 2020-08-26
  • 来自专栏JavaEdge

    JDK8源码分析之LockSupport

    二、LockSupport源码分析   2.1 类的属性  ? ? 说明:UNSAFE字段表示sun.misc.Unsafe类,查看其源码,点击在这里,一般程序中不允许直接调用,而long型的表示实例对象相应字段在内存中的偏移地址,可以通过该偏移地址获取或者设置该字段的值

    74910发布于 2020-05-26
  • 来自专栏皮皮之路

    JDK1.8】Java 8源码阅读汇总

    大概吧( ̄. ̄)) public class NewFeaturesTest { /** * output: * 所有的数: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, * 偶数: 0, 2, 4, 6, 8, * 大于5的数: 6, 7, 8, 9, */ public static void main(String args 】JDK1.8集合源码阅读——总章 【JDK1.8】JDK1.8集合源码阅读——HashMap 【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap 【JDK1.8】JDK1.8集合源码阅读 ——TreeMap(一) 【JDK1.8】JDK1.8集合源码阅读——TreeMap(二) 【JDK1.8】JDK1.8集合源码阅读——IdentityHashMap 【JDK1.8】JDK1.8集合源码阅读 ——ArrayList 【JDK1.8】JDK1.8集合源码阅读——LinkedList 【JDK1.8】JDK1.8集合源码阅读——Set汇总 【JDK1.8】JUC.Lock综述 【JDK1.8】JUC

    65440发布于 2018-06-21
  • 来自专栏刘君君

    JDK8的ArrayList源码学习笔记

    //数组大小 private int size; //数组最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    78070发布于 2018-05-21
  • 来自专栏JavaEdge

    Java集合源码解析-ConcurrentHashMap(JDK8

    Java 8取消了基于 Segment 的分段锁思想,改用CAS + synchronized 控制并发操作,在某些方面提升了性能。 它通过如下方法计算得到Key的最终哈希值. // usable bits of normal node hash static final int HASH_BITS = 0x7fffffff; 不同的是,Java 8的 = 0) { //链表深度超过 8 转换为红黑树 if (binCount >= TREEIFY_THRESHOLD) treeifyBin 等我们大致介绍完成第三部分的源码再回来对各个判断条件下的迁移过程进行详细的叙述。 至此,对于 put 方法的源码分析已经完全结束了,很复杂但也很让人钦佩 下面我们简单看看 remove 方法的实现。

    38310发布于 2021-10-18
  • 来自专栏搜云库技术团队

    面试必备:HashMap源码解析(JDK8

    一、前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也可以使用红黑树进行存储 所以可见,在分析源码的时候我们不知不觉就温习了数据结构的知识点,一举两得。 DEFAULT_LOAD_FACTOR = 0.75f; // 当桶(bucket)上的结点数大于这个值时会转成红黑树 static final int TREEIFY_THRESHOLD = 8; int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; 如果有读者有不同意见,也欢迎讨论~ 五、总结 至此,HashMap的源码就分析到这里了,其中理解了其中的核心函数和数据结构,那么理解HashMap的源码就不困难了。

    60110发布于 2019-10-17
  • 来自专栏渔夫

    Java8-Collectors.groupingBy()-JDK源码分析

    2.源码分析 CodeBlock-1: public static <T, K> Collector<T, ? CodeBlock-3: 注意: 我几乎对源码每句/块语句都进行了分析,而分析的注释都是在语句/块的下方。 源码的设计模式与思想分析  如果你觉得上述分析有难度,不妨先看这里的设计思想在返回2中进行源码阅读,又或者你lambda表达式和方法引用还未学习,在看完设计模式后,在看看我写关于Lambda表达式以及方法引用的博文 ,在回来看2中的源码也是一个循序渐进的好选择。 数据结构的键值Key D:downstrream下流收集器对象的最终结果容器 A:downstrream下流收集器对象的中间结果容器 M:M extends Map<K, D>,其为整个分类方法的中间结果容器 源码中接重要收集器接口对象的作用说明

    1.7K20发布于 2020-02-18
  • 来自专栏刘君君

    JDK8的HashMap源码学习笔记

    正文: 概念 HashMap是数组+链表+红黑树实现的,红黑树是在JDK8中增加的,优化了链表过长的效率问题 HashMap 泊松分布 HashMap源码注释有提到这个概念,泊松分布是单位时间内独立事件发生次数的概率分布 )-1) static final float DEFAULT_LOAD_FACTOR = 0.75f; //默认加载因子 static final int TREEIFY_THRESHOLD = 8; int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; 0 : (h = key.hashCode()) ^ (h >>> 16); } hash 可以看到在JDK8的实现中,优化了高位运算的算法,自己的高半区和低半区做异或,减少了低位的碰撞率。 ((e = p.next) == null) { p.next = newNode(hash, key, value, null); //链表长度大于8转换为红黑树进行处理

    1.3K80发布于 2018-05-21
  • 来自专栏皮皮之路

    JDK1.8】Java 8源码阅读汇总

    一、前言 ​    万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concurrent 二、jdk1.8新特性简述 ​    相较于之前的jdk版本,jdk1.8加入了很多新特性,诸如Lambda表达式,函数式接口,时间的处理类等新特性,值得一提的是可以在Interface接口中加入default 大概吧( ̄. ̄)) public class NewFeaturesTest { /** * output: * 所有的数: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, * 偶数: 0, 2, 4, 6, 8, * 大于5的数: 6, 7, 8, 9, */ public static void main(String args []){ List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); System.out.print

    1.3K70发布于 2018-05-17
  • 来自专栏JavaEdge

    Java集合源码解析-ConcurrentHashMap(JDK8

    Java 8取消了基于 Segment 的分段锁思想,改用CAS + synchronized 控制并发操作,在某些方面提升了性能。 它通过如下方法计算得到Key的最终哈希值. // usable bits of normal node hash static final int HASH_BITS = 0x7fffffff; 不同的是,Java 8的 = 0) { //链表深度超过 8 转换为红黑树 if (binCount >= TREEIFY_THRESHOLD) treeifyBin 等我们大致介绍完成第三部分的源码再回来对各个判断条件下的迁移过程进行详细的叙述。 至此,对于 put 方法的源码分析已经完全结束了,很复杂但也很让人钦佩 下面我们简单看看 remove 方法的实现。

    30620编辑于 2021-12-07
  • 来自专栏刘君君

    JDK8的ConcurrentHashMap源码学习笔记

    在多线程环境下性能方面比做了同步的HashMap要好,但是在单线程环境下,HashMap会比ConcurrentHashMap好一点 参考链接 深入分析ConcurrentHashMap1.8的扩容实现 seaswalker/JDK

    86040发布于 2018-05-21
  • 来自专栏刘君君

    JDK8的LinkedList源码学习笔记

    extends E> c) { //JDK8将对index的判断封装了一个方法checkPositionIndex(index); //这个就不用说了,集合转为数组 Object[]

    62640发布于 2018-05-21
  • 来自专栏全栈程序员必看

    ConcurrentHashMap源码分析(JDK8版本)

    注:本文源码JDK8的版本,与之前的版本有较大差异 ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架Spring的底层数据结构就是使用 本文的分析的源码JDK8的版本,与JDK6的版本有很大的差异。实现线程安全的思想也已经完全变了,它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。 如果加入这个节点以后链表长度大于8,就把这个链表转换成红黑树。如果这个节点的类型已经是树节点的话,直接调用树节点的插入方法进行插入新的值。 = 0) { //如果链表长度已经达到临界值8 就需要把链表转换为树结构 if (binCount >= TREEIFY_THRESHOLD key.equals(ek)))) return e.val; } } return null; } 8

    59120编辑于 2022-09-12
  • 来自专栏码云大作战

    HashMap源码分析 - JDK7和JDK8有什么区别

    前几天的文章中对JDK8的HashMap源码进行了分析,这篇文章是基于JDK8的基础上来分析下与JDK7的HashMap的区别。以下的源码主要为JDK7中HashMap的源码。 一、变量 JDK7中内部的变量比较简单,并且这些通用的变量在JDK8中也都是有的。 下图为JDK8中计算hash值的源码 //计算key的hash值 static final int hash(Object key) { int h; return (key == null 在JDK8中将运算变了简单,不代表8中不需要减少hash冲突,只不过在JDK8中使用了红黑树,当数组内所有元素小于64个时会优先进行扩容,当元素大于64个并且数组中的链表长度大于8时会转换为红黑树,因此在 而且在JDK8中采用了尾插法的方式,所以这样情况在JDK8中已经被优化了。

    49410发布于 2020-08-26
  • 来自专栏java学习java

    JDK 8 ConcurrentHashMap

    table),链表简称(bin) 初始化,使用 cas 来保证并发安全,懒惰初始化 table 树化,当 table.length < 64 时,先尝试扩容,超过 64 时,并且 bin.length > 8 { if (binCount >= TREEIFY_THRESHOLD) // 如果链表长度 >= 树化阈值(8)

    32110编辑于 2023-10-15
领券