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

    Java8 HashMap 源码分析

    Java8 HashMap 源码分析 JDK 1.6 1.7 HashMap 采用的是 数组+链表的形式, 每个桶对应不同的 hash 值,根据 key 计算得到的 hash,将键值对存放到对于的位置。 当链表长度超过 8 时,将链表转换为红黑树,大大减少查找时间。 HashMap 结构 ? 底层实现 Hash 表的结果是数组(桶)+单链表+红黑树。 */ static final int TREEIFY_THRESHOLD = 8; /** 一个桶的链表还原阀值,当桶中元素个数小于这个值是,红黑树欢迎成链表。 数组元素个数 大于 MIN_TREEIFY_CAPACITY 时,可以树化,当一个桶中元素个数大于8时(添加元素时判断),会将链表转成红黑树;当树的节点个数小于6时(删除节点时判断),会转成链表。 意思是:桶的的个数(表的容量)没有达到这个值(64)时,即使桶中元素个数大于8时,也不会转成红黑树,而是直接扩容(resize()),扩大桶的个数,桶个数两倍。

    40620发布于 2020-10-23
  • 来自专栏落叶飞翔的蜗牛

    Java8 ConcurrentHashMap源码解析

    JDK 1.8 ConcurrentHashMap存储示意图 可以发现 JDK1.8 的 ConcurrentHashMap 相对于 Java7 来说变化比较大,不再是之前的 Segment 数组 + DEFAULT_CONCURRENCY_LEVEL = 16; // 负载因子 private static final float LOAD_FACTOR = 0.75f; // 链表转红黑树阀值 > 8 进行扩容 *当为0时:代表当时的table还没有被初始化 *当为正数时:表示初始化或者下一次进行扩容的大小*/ private transient volatile int sizeCtl; 从源码中可以发现 cas更新baseCount,并判断是否需要扩容 现在我们来对每一步的细节进行源码分析,在第一步中,符合条件会进行初始化操作,我们来看看initTable()方法 /** * Initializes 当key值相等的元素形成的链表中元素个数超过8个的时候。

    51710发布于 2021-02-09
  • 来自专栏技术杂货店

    java集合【8】——— ArrayList源码分析

    下面的分析是基于1.8.0_261源码进行分析的。 1.1 ArrayList特点介绍 动态数组,使用的时候,只需要操作即可,内部已经实现扩容机制。 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // 迭代器 源码中一共定义了三个迭代器: Itr:实现了Iterator接口,是AbstractList.Itr的优化版本。 ArrayListSpliterator:继承于Spliterator,Java 8 新增的迭代器,基于索引,二分的,懒加载器。 8. 小结一下 ArrayList是基于动态数组实现的,增加元素的时候,可能会触发扩容操作。扩容之后会触发数组的拷贝复制。

    48220编辑于 2022-02-15
  • 来自专栏狗哥的 Java 世界

    Java 并发(8)CyclicBarrier 源码分析

    generation.broken = true; //设置计数器的值为需要拦截的线程数 count = parties; //唤醒所有线程 trip.signalAll(); } 上面我们已经通过源码

    49710发布于 2020-04-14
  • 来自专栏JavaEdge

    Java8的TreeMap源码解析

    图解完毕,我们来看源码吧!

    45810发布于 2021-02-23
  • 来自专栏技术杂货店

    java集合【8】-- ArrayList接口源码解析

    下面的分析是基于1.8.0_261源码进行分析的。 1.1 ArrayList特点介绍 动态数组,使用的时候,只需要操作即可,内部已经实现扩容机制。 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // 迭代器 源码中一共定义了三个迭代器: Itr:实现了Iterator接口,是AbstractList.Itr的优化版本。 ArrayListSpliterator:继承于Spliterator,Java 8 新增的迭代器,基于索引,二分的,懒加载器。 8. 小结一下 ArrayList是基于动态数组实现的,增加元素的时候,可能会触发扩容操作。扩容之后会触发数组的拷贝复制。

    55900发布于 2020-11-22
  • 来自专栏陈琛的Redis文章

    Java源码系列(7):Java8的新特性

    ,不返回任何值(看起来像是返回void) (String s) -> System.out.print(s) 遍历list: 对平常的list进行输出打印,我们平常使用的是for循环遍历,但是在Java8 public class Java8 { public static void main(String args[]) { List<String> list = new ArrayList 稍微好一点的方法就是使用Arrays提供的sort方法,自己写一个comparator,作为匿名内部类,代码如下: public class Java8 { public static void main static int compareByAge(Person a, Person b){ return a.getAge()-b.getAge(); } } public class Java8 例子来了:在Java8的Iterable接口中添加了一个默认的方法forEach,也正是因为forEach是默认方法,才不用修改Iterable的所有实现类。

    53910发布于 2020-06-12
  • 来自专栏JavaEdge

    Java线程池-ThreadPoolExecutor源码解析(基于Java8)

    返回ForkJoinPool ( JDK7引入)对象,它也是AbstractExecutorService 的子类 [5088755_1561473852906_4685968-3b4a8e8c1408f892 源码讲解 在ThreadPoolExecutor的属性定义中频繁地用位运算来表示线程池状态; 位运算是改变当前值的一种高效手段. 总结 线程池的相关源码比较精炼,还包括线程池的销毁、任务提取和消费等,与线程状态图一样,线程池也有自己独立的状态转化流程,本节不再展开。 总结 java 线程池有哪些关键属性? 参考 《码出高效》 <<Java并发编程的艺术>> Github

    7K102发布于 2018-05-16
  • 来自专栏皮皮之路

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

    一、前言 ​    万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concurrent 大概吧( ̄. ̄)) 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 ——总章 【JDK1.8】JDK1.8集合源码阅读——HashMap 【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap 【JDK1.8】JDK1.8集合源码阅读——TreeMap(

    63540发布于 2018-06-21
  • 来自专栏JavaEdge

    Java集合源码解析-ConcurrentHashMap(JDK8

    为并发而生的 ConcurrentHashMap 数据结构 Java 7为实现并发访问,引入了Segment这一结构,实现了分段锁,理论上最大并发度与Segment个数相等。 Java 8取消了基于 Segment 的分段锁思想,改用CAS + synchronized 控制并发操作,在某些方面提升了性能。 8的ConcurrentHashMap作者认为引入红黑树后,即使哈希冲突比较严重,寻址效率也足够高,所以作者并未在哈希值的计算上做过多设计,只是将Key的hashCode值与其高16位作异或并保证最高位为 等我们大致介绍完成第三部分的源码再回来对各个判断条件下的迁移过程进行详细的叙述。 至此,对于 put 方法的源码分析已经完全结束了,很复杂但也很让人钦佩 下面我们简单看看 remove 方法的实现。

    36410发布于 2021-10-18
  • 来自专栏渔夫

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

    通过对于此分组静态方法的学习,我们可以更好地了解Java在收集器collector接口实现上的设计模式以及设计思想。 2.源码分析 CodeBlock-1: public static <T, K> Collector<T, ? CodeBlock-3: 注意: 我几乎对源码每句/块语句都进行了分析,而分析的注释都是在语句/块的下方。 源码的设计模式与思想分析  如果你觉得上述分析有难度,不妨先看这里的设计思想在返回2中进行源码阅读,又或者你lambda表达式和方法引用还未学习,在看完设计模式后,在看看我写关于Lambda表达式以及方法引用的博文 ,在回来看2中的源码也是一个循序渐进的好选择。

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

    Java集合源码解析-ConcurrentHashMap(JDK8

    为并发而生的 ConcurrentHashMap 数据结构 Java 7为实现并发访问,引入了Segment这一结构,实现了分段锁,理论上最大并发度与Segment个数相等。 Java 8取消了基于 Segment 的分段锁思想,改用CAS + synchronized 控制并发操作,在某些方面提升了性能。 8的ConcurrentHashMap作者认为引入红黑树后,即使哈希冲突比较严重,寻址效率也足够高,所以作者并未在哈希值的计算上做过多设计,只是将Key的hashCode值与其高16位作异或并保证最高位为 等我们大致介绍完成第三部分的源码再回来对各个判断条件下的迁移过程进行详细的叙述。 至此,对于 put 方法的源码分析已经完全结束了,很复杂但也很让人钦佩 下面我们简单看看 remove 方法的实现。

    29620编辑于 2021-12-07
  • 来自专栏皮皮之路

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

    一、前言 ​    万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concurrent 大概吧( ̄. ̄)) 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
  • 来自专栏网络日志

    Java 8中 Optional 类源码实现与分析

    Optional 类位于 java.util 包下,自 JDK 1.8 版本新增的,它是一个 final 类,不能被继承,且构造函数是 private 的,不能被实例化,它提供了一系列对 null 空值的处理方法 public final class Optional<T> { private Optional() { this.value = null; } } 众所周知,在Java 那么在Java 8 中为什么会引入这样的一个 Optional 类呢? ,将会直接返回静态常量 EMPTY . (2)of() of() 方法将指定值用 Optional 封装之后返回,如果该值为 null ,则抛出一个 NullPointerException 异常,其源码如下 value : other; } (8)orElseGet() orElseGet() 方法和 orElse() 方法的作用类似,只是当没有值时, orElseGet() 方法不是直接返回一个值,而是一个由指定的

    31010编辑于 2024-05-29
  • 来自专栏个人技术博客

    Java基础】Java8集合(源码分析+底层原理)

    CSDN话题挑战赛第2期 参赛话题:学习笔记 Java8集合:ArrayList 一、前言 二、集合ArrayList方法 1.构造方法 ①空参构造器 ②带参构造器 2.grow方法 3.size 方法 4.isEmpty方法 5.add方法 6.get方法 7.set方法 8.indexOf方法 9.lastIndexOf方法 10.remove方法 ---- 一、前言 集合主要分为Collection 接口 与 Map接口两类,而ArrayList就是Collection接口中List子接口的实现类… 在上一篇文章中,我们通过ArrayList实现类的源码,了解到了其中的属性,比较印象深刻的应该是ArrayList 而在这篇文章中,我们将讲解集合中ArrayList实现类的方法: ---- 二、集合ArrayList方法 1.构造方法 ①空参构造器 源码: public ArrayList() { 先是使用rangeCheck(index)方法判断下标index是否越界; 然后就是将index下标对应的元素替换成传入的element; list.set(index,element); ---- 8.

    46520编辑于 2022-11-15
  • 来自专栏JavaEdge

    Collections.sort()源码分析(基于JAVA8)

    java.lang.Object java.util.Collections简介 此类仅包含操作或返回集合的静态方法。 super T>> 表示该方法中传递的泛型参数必须实现了Comparable中的compareTo(T o)方法,否则进行不了sort排序 其sort方法实现都委托给了java.util.List接口的默认实现的 ts.mergeForceCollapse(); assert ts.stackSize == 1; } (1)传入的待排序数组若小于阈值MIN_MERGE(Java [1,2,5,6,7,8,10,12] [3,4] [9,11,13,15,16,14] => 入栈 (2.2.3) 当前的栈区块大小为[8,2] => 进入merge循环 (2.2.4) do [14]这个元素:[1,2,5,6,7,8,10,12] [3,4,9,11,13,15,16] [14] => 入栈 (2.2.3) 当前入栈的区块大小为[8,7,1] => 进入merge循环

    2.4K130发布于 2018-05-16
  • 来自专栏挨踢小子部落阁

    Java 8 Lambda 的实现原理及源码剖析

    为了支持函数式编程,Java 8引入了Lambda表达式,那么在Java 8中到底是如何实现Lambda表达式的呢? Lambda表达式经过编译之后,到底会生成什么东西呢? 在没有深入分析前,让我们先想一想,Java 8中每一个Lambda表达式必须有一个函数式接口与之对应,函数式接口与普通接口的区别,可以参考前面的内容,那么你或许在想Lambda表达式是不是转化成与之对应的函数式接口的一个实现类呢 8 到底是用什么方式实现的呢? 是不是上面三种实现方式中的一种呢,你也许觉的自已想的是对的,其实本来也就是对的,在 Java 8 中采用的是内部类来实现 Lambda 表达式。 那么 Lambda 表达式到底是如何实现的呢? 有了上面的内容,可以知道的是 Lambda 表达式在 Java 8 中首先会生成一个私有的静态函数,这个私有的静态函数干的就是 Lambda 表达式里面的内容,因此上面的代码初步可以转化成如下所示的代码

    1.9K53发布于 2019-10-24
  • 来自专栏JavaEdge

    ArrayList源码解析(基于Java8)扩容删除

    顺便看一看size()方法的源码 很简单,就是返回size值,而不是底层数组的长度,就是为何String里叫length()而List里叫size()的原因 有人说,诶,就一个元素,在堆内存中占了

    1.3K81发布于 2018-05-16
  • 来自专栏个人技术博客

    Java基础】Java8集合(底层原理+源码分析)

    CSDN话题挑战赛第2期 参赛话题:学习笔记 Java8集合:ArrayList 前言 一、ArrayList概述 二、ArrayList属性 1.序列号 serialVersionUID 2.默认容量 DEFAULT_CAPACITY 3.空数组常量 EMPTY_ELEMENTDATA 4.默认空数组常量 5.存储数组 elementData 6.数组长度 size 7.容量上限 MAX_ARRAY_SIZE ---- 前言 Java 可以说Java集合就像是一个容器,可以动态地把多个对象引入到容器当中。 属性源码: /** * The array buffer into which the elements of the ArrayList are stored. array size exceeds VM limit */ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    46830编辑于 2022-11-15
  • 来自专栏山行AI

    java8中skiplist的实现及源码分析

    类继承图(针对java8) ? ConcurrentSkipListMap的结构: ? 属性和部分方法如图: ? 2. total space * requirement for a map is slightly less than for the current * implementation of java.util.TreeMap (This is one of the few times I've wished Java * had macros.) 源码 1. Node结构如图: ? Node是单向的链表结构。 一个节点的属性有key值和value值,节点之间是有序连接的,头节点和一些marker节点有些不一样,因为它们经常被赋予特殊值。

    1.3K20发布于 2019-06-28
领券