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

    Java String 源码分析

    Java String 源码分析 定义 Java 8 中 String 源码 public final class String implements java.io.Serializable String 是final 类型不能被继承,同时实现了 java.io.serializable Comparable charSequence 三个接口。 static final long serialVersionUID = -6849794470754667710L; String 实现了 Serializable 接口,支持序列化和反序列化支持,Java 使用字节数组来构建 String Java 中,String 实例中报错一个字符数组,char[] 字符数组时以 unicode 码来存储的。 Java 8 中采用的是 Array.copy 方法,避免了这个问题 public String(char value[], int offset, int count) { if (offset

    54910发布于 2020-10-23
  • 来自专栏二进制文集

    Java LinkedHashMap 源码分析

    分析 内部结构 LinkedHashMap继承自HashMap,内部额外维护了一个Entry的双向链表,用于记录访问和插入顺序。

    61430发布于 2019-02-25
  • 来自专栏大数据学习笔记

    Java HashSet源码分析

    1、源码分析 废话不多说,直接上代码,相关解释请参见注释 package java.util; /** * * @param <E> the type of elements maintained HashMap * @since 1.2 */ public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable s) throws java.io.IOException { // Write out any hidden serialization magic s) throws java.io.IOException, ClassNotFoundException { // Read in any hidden serialization 通过源码可知,HashSet实际上由HashMap支持实现。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。

    35010编辑于 2022-05-06
  • 来自专栏二进制文集

    Java Stream 源码分析

    前言 Java 8 的 Stream 使得代码更加简洁易懂,本篇文章深入分析 Java Stream 的工作原理,并探讨 Steam 的性能问题。 image 源码结构 Stream 相关类和接口的继承关系如下图所示: ? image 操作叠加 Stream 的基础用法就不再叙述了,这里从一段代码开始,分析 Stream 的工作原理。 分析如下: 对于基本类型Stream串行迭代的性能开销明显高于外部迭代开销(两倍); Stream并行迭代的性能比串行迭代和外部迭代都好。 image 分析,对于复杂的归约操作: Stream API的性能普遍好于外部手动迭代,并行Stream效果更佳; 再来考察并行度对并行效果的影响,测试结果如下: ?

    58441发布于 2020-12-08
  • 来自专栏二进制文集

    Java Stream 源码分析

    前言 Java 8 的 Stream 使得代码更加简洁易懂,本篇文章深入分析 Java Stream 的工作原理,并探讨 Steam 的性能问题。 操作分类详情如下图所示: [2020-12-03-030958.jpg] 源码结构 Stream 相关类和接口的继承关系如下图所示: [2020-12-03-031525.jpg] BaseStream [2020-12-03-033401.png] 操作叠加 Stream 的基础用法就不再叙述了,这里从一段代码开始,分析 Stream 的工作原理。 java.util.stream.StreamSupport#stream(java.util.Spliterator<T>, boolean) public static <T> Stream<T> 分析如下: 对于基本类型Stream串行迭代的性能开销明显高于外部迭代开销(两倍); Stream并行迭代的性能比串行迭代和外部迭代都好。

    3.4K53发布于 2020-12-03
  • 来自专栏全栈程序员必看

    Java volatile源码分析

    而针对volatile修饰的变量给java虚拟机特殊的约定,线程对volatile 变量的修改会立刻被其他线程所感知,即不会出现数据脏读,从而保证数据的一个可见性。 volatile 特性分析 特性一:可见性 前面介绍Java内存模型的时候,我们说过可见性是指当一个线程修改了共享变量的值,其他线程立即感知到这种变化。 特性二、禁止重排序 前面介绍Java 内存模型的时候,我们说过java中的有序性可以概况为一句话:如果在本线程中观察,所有的操作都是有序的;如果在另外一个线程中观察,所有的操作都是无序的。

    34650编辑于 2022-09-09
  • 来自专栏wannshan(javaer,RPC)

    java ThreadLocal 分析by 源码

    可以,通过inheritableThreadLocals属性子线程可以继承父线程的local变量,具体通过InheritableThreadLocal

    49030发布于 2021-03-18
  • 来自专栏后端Coder

    java进阶|java队列源码分析

    今天我要分享的是java里面比较常见的数据结构队列的源码分析,队列,先进先出模式,即FIFO的特点,日常生活中队列的特点也随处可见,超市购物排队,餐厅排队买饭等一系列都满足了队列的先进先出的特点,java 也不是,主要是之前我自己分析了ArrayList,LinkedList以及Stack的源码文章了,到这里就理所应当的应该分析队列的这种数据结构了,满足一下学生时代心心念的数据结构吧。 说了这么多,接下来就逐渐去分析队列的源码吧,写到这时下起了小雨,对,这个时间段是晚上十点左右,这篇文章是自己继五一放假来的第一篇文章,自己玩着玩着手机就突然想起了要写这篇文章了,索性就过来写了,要是学生时代这么努力多好 关于读源码,如何进行梳理整个过程,每个人都有着自己的一套,在这里我就以自己的一套来进行分析好了。 十,到这里就结束了自己对队列的源码分析,其实你会发现我这里没有对队列的每一个方法进行分析,其实都差不多,这里起到一个开头作用就可以了,下面的每个分析方法都差不多。

    96620发布于 2020-05-26
  • 来自专栏后端Coder

    java之CopyOnWriteArraySet源码分析

    上篇我们分享了CopyOnWriteArrayList的源码分析,这次我们打算来分享 CopyOnWriteArraySet的源码分析,当自己整理了一下源码流程时发现这篇文章没什么写头,底层是在基于利用 package com.wpw.asyncthreadpool; import java.util.concurrent.CopyOnWriteArraySet; public class CopyOnWriteArraySetTest 我们看下在CopyOnWriteArrayList源码里面我们没有介绍到的containsAll()方法,由于这篇讲的是set,但是底层还是使用的是CopyOnWriteArrayList,所以我们这里继续分析 destPos, int length); 我们看上面的方法修饰符是由native关键字修饰的,所以它是在本地方法栈执行的,不是在java 到这里我们的分享内容就结束了,今天写了CopyOnWriteArrayList的姊妹篇 CopyOnWriteArraySet的源码分析,其实底层实现是基于CopyOnWriteArrayList的,喜欢文章的可以关注公众号

    59620发布于 2019-11-05
  • 来自专栏后端Coder

    java进阶|PriorityQueue源码分析

    0x01,闲聊一下 本来今天(2020/06/xx)是打算分析一下ArrayBlockingQueue队列的源码的,但是看了半个多小时吧,还有一点没有想明白,索性就没有继续以文章的方式输出了,但是看了ArrayBlockingQueue 的源码,倒是觉得它就是一个线程安全的队列,所以后面打算分享一下吧,谁让当时理解不了那个知识点呢,后面再说了,后面自己就写了java的等待通知机制的文章和限流的文章,所以这是今天写的第三篇文章了,好了,好了 ,不闲扯了,这里我就来分析了优先级队列的源码,因为我理解了里面的内容,不写出来总觉得没有掌握这个内容,其实也不是,可能是写文章写多了,不写总觉得不习惯,是的,不习惯。 0x02,步入主题 一般,我在分析源码的时候总是从构造函数入手,想起构造函数还是想起了要写一篇如何创建java对象的文章吗,不知道,还是在自己的内心沉淀一段时间再说吧,毕竟写文章是需要很花费一个人很长的时间的 ,这是第15篇源码分析的文章,最近也在思考一下这两年的点点滴滴,如果自己有时间以及自己如果思考的有意义的话语,自己会单独写一篇这两年的点点滴滴分享一下,或许对于自己也是一个总结。

    42020发布于 2020-07-02
  • 来自专栏后端Coder

    java之StopWatch源码分析

    这时我们就用到了java常用的计时方式之一了,System.currentTime()方法在方法的前后计算时间差。配上代码的方式我们来看下。 System.out.println("统计计算0~1000000000相加的总和" + sum + "耗时时间为:" + (endTime - startTime) + "ms");     } 我们先分析这段代码涉及的内容吧 public static native long currentTimeMillis(); 上面的方法使用native关键字进行标识,这不是一个java方法,而是一个本地方法,本地方法是运行在本地方法栈的 想了解本地方法栈和java方法栈的内容可以先看下这两篇文章java虚拟机,应该了解一点点,另外一篇是java内存区域划分详解,后面的一篇是对前面内容的详细描述吧,希望可以帮助到你,喜欢的可以关注此公众号 下面再分析一下这个方法了,在我们的示例中,我们使用了下面的这个方法prettyPrint()进行信息格式友好的输出。

    1.1K10发布于 2019-10-24
  • 来自专栏CSDN迁移

    Java集合类源码分析

    Java集合类源码分析 〇、说明 一、Object类 1. 继承结构 2. 构造方法 3. 常用方法和参数 5. native关键字 二、ArrayList类 0. 数据结构 1. 继承结构 2. 如何看源码 (1)看继承结构 看这个类的层次结构,处于一个什么位置,可以在自己心里有个大概的了解。 (2)看构造方法 在构造方法中,看做了哪些事情,跟踪方法中里面的方法。 构造方法 @HotSpotIntrinsicCandidate,java 9 中引入的HotSpot高校实现代码方式。 9之后就被标记为过时的方法,Oracle建议用java.lang.ref.Cleaner来替代。 5. native关键字 通过JNI(Java Native Interface)接口调用其他语言来实现对底层的访问。

    60620编辑于 2022-10-25
  • 来自专栏后端Coder

    java进阶|TreeSet源码分析

    这次自己去分析了TreeSet的源码,这里就开始文章的下文吧,首先我还是按照构造函数的分析开始了。 TreeMap的源码,但是这不影响我的分析,因为我已经分析完TreeSet集合的源码,整个的过程中没有阻塞性,所以分析TreeSet集合继续了。 首先,TreeSet集合和其它普通的集合一样,主要是用来作为数据的容器装载,集合嘛可以理解为动态扩容的数组,因为数组的内存空间是静态分配的,记得理解动态和静态分配的这个内容是在18年初,那个时候可谓是对java 这门语言没有一个很高的把握,但是工作中的内容还是可以的,那个时候自己都写了java8的写法,但是时过两年后自己才去输出和分享了java8的文章,所以觉得自己想写的文章是不是拖延了很久,读过我的文章读者的就知道 final Object PRESENT = new Object(); 是的,它就是一个常量值,这样就会直接调用TreeMap的put()方法不用传动态的value值了,其实你看过HashSet的源码就会知道

    62920发布于 2020-05-29
  • 来自专栏Java程序员那些事

    Java中HashMap源码分析

    key计算hash值得到插入的数组索引i,如果tab[i]==null,直接新建节点添加,否则转入33,判断当前数组中处理hash冲突的方式为链表还是红黑树(check第一个节点类型即可),分别处理红黑树源码  resize()扩容 14 int threshold; 15 16 //记录 hashMap 装载因子 17 final float loadFactor; HasMap的扩容机制resize()源码 } } } } } return newTab; } 在java jdk8中对HashMap的源码进行了优化,在jdk7中,HashMap处理“碰撞”的时候,都是采用链表来存储,当碰撞的结点很多时,查询时间是O(n)。

    65420发布于 2019-09-17
  • 来自专栏johnhuster

    java stream distinct源码分析

    return this.name.equals(((A) obj).getName()); } } 输出结果如下: hello world 具体为什么会有上述结果呢,让我们来看下DistinctOps源码 } } }; } } }; } 上面标浅蓝色部分就是原因,即java

    45510编辑于 2022-03-28
  • 来自专栏后端Coder

    java进阶|LinkedBlockingDeque源码分析

    这是关于java集合类源码分析文章的最后一篇,后面或许会随着自己的一些理解,自己还是会再来写一两篇集合源码分析的文章,因为目前自己的理解,有些集合的源码自己确实理解不了,所以我就不继续分析其它集合源码了 ,这是源码分析的第14篇,java中常用的集合基本上分析完了,除了HashMap之类的没有分析,都分析完了。 关于HashMap的源码分析,自己在之前的文章中说过自己不会去分析它,因为我觉得你理解了散列函数就差不多了。 一,LinkedBlockingDeque的类结构,理解这个结构才能"登高望远" 这个图可以看出来java作为一门高级语言的"单继承","多实现"的特点,理解这点就可以了。 自己想分析的方法都分析完了,其它的pop()方法就分析了,因为每个方法都在上面分析了,这里暂时不在这里做一下分析源码分析总结的文章了,说不定哪天自己理解好了就会单独写一篇自己对源码分析总结的文章分享出来

    53130发布于 2020-06-17
  • 来自专栏后端Coder

    java进阶|ArrayBlockingQueue源码分析

    其实分析这篇文章的时候自己在想,java这门高级语言真的很好,它的特性也给了自己很多的思考,ArrayBlockingQueue源码分析完之后,我应该不在去分析java源码了,已经写好的内容,自己会输出和分享出来 一般工作中我们都是面向业务进行编写代码的,是的,调用javaAPI进行数据操作,所以分析源码算是自己的一个喜好吧,不然我也不会大半夜不睡觉在分析自己喜欢的java语言吧,在18年下半年的时候自己就早已去分析过一部分数据结构了 这也是最初自己为什么在公众号里面用简单的文字去描述一个技术点,有的人乐于分析spring源码,其它框架的源码,但是我自己不去分析这样的框架,至少目前是,因为我水平达不到,以及我工作中也用不到去分析这样的源码 这次要分析的ArrayBlockingQueue源码或许是我对之前写的线程池的理解有所帮助一点,主要是为了回顾一下队列的使用,之前好像在分析队列的源码时自己好像说过队列在工作中没有用到过,好像线程池里面用到了队列 java8的用法,这个真的很好用,自己也分享了两篇关于java8的操作,这可是工作中常用的操作哈。

    48310发布于 2020-05-29
  • 来自专栏后端Coder

    java之CopyOnWriteArrayList源码分析

    今天我们来分享一下与java相关的CopyOnWriteArrayList的技术点,可能有的人是第一次见到这个,也有可能早已了解,今天我们就来对其源码进行分析,来熟悉和了解一下什么是写时复制容器。 package com.wpw.asyncthreadpool; import java.util.concurrent.CopyOnWriteArrayList; public class CopyOnWriteArrayListTest 既然上面的示例程序中我们已经使用的获取集合大小的size()方法,在这里我们就对其进行分析好了。看下程序代码咯。 好了,这里的clear()方法的程序代码流程我们就分析完了。 集合常用的方法判空操作也是很常用的,接下来我们继续对集合提供的isEmpty()方法进行分析了。 我们看下下面的这个方法好了,lastIndexOf()方法,这个方法的程序代码我们还是继续分析下好了,其实在这里说下,这篇文章很长,因为我要对每一个方法都要进行分析一下,看下它提供了哪些,这样我们在使用集合的时候可以针对具体情况使用不同的方法去解决问题

    44210发布于 2019-10-30
  • 来自专栏Java系列文章

    JAVA进阶:String源码分析

    JAVA进阶:String源码分析 String结构 /*Strings are constant; their values can not be changed after they are created.Stringbuffers Forexample:*/public final class String implements java.io.Serializable, Comparable<String>, CharSequence 源码里可以看到String被final修饰并继承了三个接口 源码注释也说到字符串是不变的; 它们的值在创建后无法更改.Stringbuffers支持可变字符串。 StringBuilder StringBuilder和Stringbuffer这两个类的方法都很想一样,因此我们就那StringBuilder的源码分析 等下再去看三者之间的关系和不同 结构和构造 } return false; } 基本数据类型比较值引用数据类型比较地址值 (对象的引用,在堆空间,String在字符串池,newString在堆空间) 根据下面案例分析一下源码

    1.2K20发布于 2019-06-02
  • 来自专栏Linux内核及编程语言底层相关技术研究

    Java对象创建源码分析

    本文将从源码角度分析Java对象是如何被创建的。 OpenJDK版本 ➜ hg id 76072a077ee1+ jdk-11+28 首先来看段Java代码 public class Hello { private Hello() {} static Hello create() { return new Hello(); } } 其对应的字节码为 ➜ javac Hello.java ➜ javap -c Hello 因为本文分析的是Java对象的创建过程,所以这里我们只看字节码new,其他字节码不再赘述。 该类中的_metadata字段是用来标识这个对象所属的类,Java对象就是通过它来获取各种和类有关的信息的。

    71920编辑于 2023-03-15
领券