jdk源码
Java觉浅
我不懒,也还没添加简介
展开
-
【总】JDK1.8源码 由浅入深!抽丝剥茧!重要类的归纳总结!
一、 java.lang我的jdk源码(一):Object 一切类的根本!我的jdk源码(二):String 一个特殊而强大的类!我的jdk源码(三):AbstractStringBuilder类我的jdk源码(四):StringBuffer 线程安全可多次修改我的jdk源码(五):StringBuilder 高效可多次修改String我的jdk源码(六):Thread我的jdk源码(七): ThreadLocal二、 ...原创 2020-06-18 00:10:03 · 307 阅读 · 0 评论 -
我的jdk源码(二十四):AtomicInteger类和CAS机制
一、概述AtomicInteger类处于java.util.concurrent.atomic包下,与其他原子操作的类一样,底层都是采用CAS机制,调用了Unsafe类的CAS方法实现的。我们先分析一下AtomicInteger类的源码,再来分析CAS机制的种种。二、源码分析 1. 类的声明public class AtomicInteger extends Number implements java.io.Serializable继承了 Number, 这主要...原创 2020-06-18 00:00:13 · 417 阅读 · 0 评论 -
我的jdk源码(二十三):ReentrantLock类
一、概述ReentrantLock类是在内部利用自己的内部类Sync继承了AbstractQueuedSynchronizer,实现了tryAcquire()方法,在这个方法中增强自己的功能,比如添加了重入和公平锁、非公平锁。ReentrantLock再将Sync作进一步的封装,开放出去Lock的接口。ReentrantLock是通过在请求锁的时候判断CLH列表有没有比当前线程等待时间更久的线程来实现公平性的。当一个线程请求公平锁的时候,如果state为0,还需要在CHL中没有等待节...原创 2020-06-16 23:20:19 · 263 阅读 · 0 评论 -
我的jdk源码(二十二):AbstractQueuedSynchronizer类
一、概述AbstractQueuedSynchronizer类翻译为抽象队列同步器, 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架,也是一个Java提供的底层同步工具类,用一个int类型的变量state表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,比如 ReentrantLock、CountDownLatch 和 Semaphore 等都是基于AQS实现的,因此学习AQS的使用与源码实现对深...原创 2020-06-15 17:10:53 · 322 阅读 · 0 评论 -
我的jdk源码(二十一):ConcurrentHashMap类
一、概述ConcurrentHashMap类实际上就是为了解决HashMap的线程不安全而设计的类,ConcurrentHashMap类处于jdk的并发包下,在并发编程中有着非常重要的作用。二、源码分析 1. 类的声明public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable ...转载 2020-06-11 10:29:54 · 284 阅读 · 0 评论 -
我的jdk源码(二十):TreeSet类
一、概述TreeSet类的构造方法底层调用的是TreeMap类的构造方法,也就是说,TreeSet类底层也是红黑树的结构,红黑树的结构这里不再赘述,小伙伴们可以在《我的jdk源码(十九):TreeMap类 红黑树实现的map结构》一文中看到。类似HashSet与HashMap的关系,TreeSet类中,也是将要添加的对象E作为key-value组成的TreeSet元素中的key,value存的也是一个预先就声明好的空对象, 所以当你既想利用Map的高效查找特性,又想维持元素特定的顺序,又想保证元...原创 2020-06-09 15:09:38 · 231 阅读 · 0 评论 -
我的jdk源码(十九):TreeMap类 红黑树实现的map结构
一、概述TreeMap类是一个有序的key-value的集合,与HashMap不同,TreeMap底层只有一个红黑树的结构(对红黑树不了解或者不熟悉的和觉得文字太枯燥的,推荐一个在线演示地址: https://rbtree.phpisfuture.com/ ),结点TreeMap类的内部类Entry,维护树结构;并且由于红黑树的特性,使得元素保存在TreeMap中默认是根据key值的自然顺序排序,也可以传入特定的比较器实例使TreeMap维持指定的顺序。所以,当你既想利用Map的高效查找特性,又...原创 2020-06-09 00:05:21 · 595 阅读 · 0 评论 -
我的jdk源码(十八):LinkedHashSet类
一、概述LinkedHashSet类也是集合家族中的一员,LinkedHashSet类是Set类的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,也就是我们插入的顺序。那么具体如何实现,请看源码解析。二、源码解析 1. 类的声明public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Seria...原创 2020-06-07 23:31:55 · 210 阅读 · 0 评论 -
我的jdk源码(十七):Objects类
一、概述Objects类是一Object类的个工具类,类似Collections类,提供一些静态的工具方法,着重于校验空指针以及获取hash值等,弥补我们在写代码时不小心忽略空指针等异常情况,从jdk1.7被加入进来,Objects类被final修饰不能被继承,拥有私有的构造函数。二、源码解析 1. 类的声明public final class Objects 没什么好说的,就是被final修饰,表示Objects类为最终类,不能被继承。 2. 构造...原创 2020-06-07 21:59:34 · 358 阅读 · 1 评论 -
我的jdk源码(十六):LinkedHashMap类
一、概述LinkedHashMap类是继承自HashMap类,但是在HashMap的数据结构基础上,使得每个桶的元素又通过新Entry特殊的结构,组成一条双向链表。有了双向链表的结构,就能保证LinkedHashMap的实例在默认情况下能够保持元素的插入顺序。二、源码剖析 (1) 类的声明public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V&...原创 2020-05-29 23:34:17 · 213 阅读 · 0 评论 -
教你一招:如何获取HashMap的容量capacity和阈值threshold
一、背景 在深入学习HashMap等集合类的源码时,如果对于动态扩容或初始化的代码理解不透彻,那么我们需要实时监控HashMap的容量capacity以及阈值threshold的变化,这样更能直观的展示出来,便于我们理解源码。话不多说直接上代码!二、分析 (1) 代码展示 public static void main(String[] args) throws Exception { //指定初始容量15来创建一个HashMap HashMap m = n....原创 2020-05-29 13:20:17 · 7744 阅读 · 7 评论 -
我的jdk源码(十五):HashSet类
一、概述HashSet类是常用的Set集合类,底层是采用HashMap来实现的,我们通常利用HashSet类的元素不重复的特性来达到去重的效果,那么跟随源码去一探究竟吧。二、源码分析 (1) 类的声明public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable 在类的声明中我们可以看...原创 2020-05-28 17:08:43 · 396 阅读 · 0 评论 -
我的jdk源码(十四):Hashtable类
一、概述 Hashtable类继承于Dictionary抽象类,jdk注释中说明了Dictionary类已经过时,新的实现类应该去实现Map接口,而不是继承Dictionary类。但是面试的时候还是常常会问到Hashtable与HashMap的区别,所以我们还是来看一下Hashtable类的源码,以及现在的实际应用场景中用什么类来代替它。二、源码分析 (1) 类的声明public class Hashtable<K,V> extends Dictionary...原创 2020-05-28 15:27:16 · 325 阅读 · 0 评论 -
我的jdk源码(十三):HashMap 一磕到底,追根溯源!
一、前言HashMap作为java重要的数据结构之一,是jdk源码阅读必看的内容,今天就带大家一起深入分析,探讨jdk1.7和jdk1.8下HashMap的结构有哪些区别变化,并且深入分析产生这些变化的原因,最后再结合近几年的面试题目进行分析探讨。那我们开始吧!二、HashMap概述HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap与HashTable的作用大致相同,但是它不是线程安全的。此类不保证映射的顺序...原创 2020-05-27 16:03:34 · 436 阅读 · 0 评论 -
我的jdk源码(十二):LinkedList类
一、概述LinkedList类是基于双向链表实现的,它在内存中不占用连续的内存空间,里面的每个元素都能指向前一个元素和后一个元素,这使得它可以双向遍历。LinkedList类和ArrayList类相比,不具备快速随机访问的能力,但是插入和删除元素要比ArrayList类高效。二、源码分析 (1) 类的声明public class LinkedList<E> extends AbstractSequentialList<E> implem...原创 2020-05-27 15:51:19 · 400 阅读 · 0 评论 -
我的jdk源码(十一):ArrayList类
一、概述ArrayList类是AbstractList的子类,实现了具体的add(), set(), remove()等方法。它是一个可调整大小的数组可以用来存放各种形式的数据。二、源码分析 (1) 类的声明,源码如下:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io...原创 2020-05-27 15:45:47 · 285 阅读 · 0 评论 -
我的jdk源码(十): AbstractSet Set家族的骨架实现类
一、概述AbstractSet类是Set家族中的骨架实现类,在接口与实现类之间构建了一层抽象,其目的是为了复用一些比较通用的函数以及方便扩展,为子类提供共用的方法模板。 AbstractSet类相比AbstractList和AbstractMap内容要少很多。二、源码分析 (1) 类的声明,源码如下:public abstract class AbstractSet<E> extends AbstractCollection<E> implements...原创 2020-05-27 15:40:05 · 251 阅读 · 0 评论 -
我的jdk源码(九):AbstractMap Map家族的骨架实现类
一、概述AbstractMap类是Map大家族中的骨架实现类,在接口与实现类之间构建了一层抽象,其目的是为了复用一些比较通用的函数以及方便扩展,为子类提供共用的方法模板。二、源码分析 (1) 类的申明,源码如下:public abstract class AbstractMap<K,V> implements Map<K,V>AbstractMap类是一个抽象类,并且实现了Map。 (2) 成员变量,源码如下: //k...原创 2020-05-27 10:20:22 · 291 阅读 · 0 评论 -
我的jdk源码(八):AbstractList List家族的骨架实现类
一、概述此类提供的骨干实现的List接口以最小化来实现该接口由一个“随机访问”数据存储备份所需的工作(如阵列)。要实现一个不可修改的列表,只需要继承这个类并提供get(int)和size()方法的实现。要实现可修改的列表,必须另外覆盖set(int, E)方法(否则会抛出一个UnsupportedOperationException )。如果列表是可变大小,则我们必须另外覆盖add(int, E)和remove(int)方法。继承结构如下图:二、源码分析 (1) 类的声明源码如...原创 2020-05-27 10:14:03 · 285 阅读 · 0 评论 -
我的jdk源码(七):ThreadLocal类
一、概述ThreadLocal类是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。 简单说ThreadLocal就是一种以" 空间换时间 "的做法,在每个Thread里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,从而保证线程安全。下面就来深入分析一下ThreadLocal类的源码。...原创 2020-05-27 10:08:32 · 277 阅读 · 0 评论 -
我的jdk源码(六):Thread类
一、概述 Tread类是线程基础类。 线程是系统资源分配的最小单位,它被包含在进程之中,是进程中的实际运作单位。在实际的开发场景中,总会遇到多线程的问题,那么学好Thread类的源码能够有助于我们有更加清晰的认识。话不多说,直接进入源码!二、源码分析 (1)类的声明,源码如下://一个“线程”是指在程序中执行的线程。Java虚拟机允许应用多个线程并发运行。//每个线程都有优先级,优先级高的先执行。线程可能是守护线程或者不是。//线程的优先级等于创建线程的优先级,当且仅当一...原创 2020-05-27 09:59:52 · 572 阅读 · 0 评论 -
我的jdk源码(五):StringBuilder 高效可多次修改String
一、概述StringBuilder类和StringBuffer类一样,也是我们动态操作字符串常用到的类,jdk1.8中StringBuilder同样继承了父类AbstractStringBuilder类,并且在源码内很多方法都是直接调用的父类AbstractStringBuilder的方法。和 StringBuffer类不同的是,StringBuilder 类的没有了字符缓存数组,成员方法也没有被synchronized关键字修饰,所以StringBuilder是线程不安全的,但是效率会更高,这...原创 2020-05-25 22:55:32 · 559 阅读 · 0 评论 -
我的jdk源码(四):StringBuffer 线程安全可多次修改String
一、概述StringBuffer类是我们动态操作字符串常用到的类,jdk1.8中StringBuffer继承了父类AbstractStringBuilder类,并且在源码内很多方法都是直接调用的父类AbstractStringBuilder的方法。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。 接下来就让我们进入到StringBuffer的源码学习!二、源码分析 (1) 类的声明源码如下:...原创 2020-05-25 12:38:34 · 1141 阅读 · 0 评论 -
我的jdk源码(三):AbstractStringBuilder类
一、概述 我们在jdk1.8的源码中可以看到,StringBuilder类和StringBuffer类都是继承了AbstractStringBuilder类的,并且很多方法都是直接使用的父类AbstractStringBuilder的方法,所以在学习StringBuilder类和StringBuffer类之前,先来研究一下AbstractStringBuilder的源码。二、源码分析 (1)类的申明,源码如下:abstract class AbstractStringBuild...原创 2020-05-24 14:05:25 · 1557 阅读 · 0 评论 -
我的jdk源码(二):String 一个特殊而强大的类!
一、概述 String类在java中是一个比较特殊的存在,它虽然不是基本类型,但是使用频率却非常高。这主要是因为String对象的值是一个常量,为什么是常量在下文源码中我们可以看到,正是因为它这一特性,所以它是线程安全的。接下来就让我们深入分析源码,揭开String类的神秘面纱!二、源码 (1) 类的定义,源码如下//String是final类型的,属于不可覆盖类型public final class String implements java.io.Se...原创 2020-05-23 11:45:36 · 411 阅读 · 0 评论 -
我的jdk源码(一):Object 一切类的根本!
一、概述Object 类是位于java.lang包下面的类,是所有类的父类,是类层级的根,所有的对象,包括数组、也都实现了Object的方法。二、源码分析 (1) registerNatives方法与静态代码块,源码如下:private static native void registerNatives(); static { registerNatives(); } 说明: * native 关键字修饰的方法...原创 2020-05-22 18:10:17 · 482 阅读 · 2 评论