![](https://img-blog.csdnimg.cn/20200309154612101.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JDK源码解析
解析JDK源码
三木加两木
2021加油!拿到大厂offer!!!
展开
-
【图解】HashMap1.7 头插法造成死循环的原因
1.概述HashMap1.7当中,扩容的时候,采用的是头插法转移结点,在多线程并发的情况下会造成链表死循环的问题。2.图解假设有两个线程,线程1和线程2,两个线程进行hashMap的put操作,触发了扩容。下面是扩容的时候结点转移的关键代码void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j <原创 2021-01-13 18:41:48 · 15576 阅读 · 17 评论 -
JDK源码解析---ExecutorService
文章目录1.概述2.具体接口方法2.1 shutdown2.2 shutdownNow2.3 isShutdown2.4 isTerminated2.5 awaitTermination2.6 submit2.7 invokeAll2.8 invokeAny1.概述ExecutorService接口是对Executor接口的扩展,它添加了一些新功能,如支持有返回结果的任务、支持超时任务、支持取消任务、支持批量提交任务。这里的submit方法,返回类型是Future,返回后,只表示任务已提交,不代表已经执原创 2020-10-12 20:05:30 · 301 阅读 · 0 评论 -
JDK源码解析---Executor
文章目录1.概述1.概述根据接口中JDK提供的英文描述,可以知道这个接口提供了将任务提交和任务执行分离开来的方法。executor.execute(new RunnableTask1());但是这个接口并不是严格要求任务是异步执行的,可以提交后立马执行。class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); }}但大多数情况下,任务是在提交者线程原创 2020-09-24 19:11:06 · 182 阅读 · 0 评论 -
JDK源码解析---SortedSet
文章目录1.概述2. 接口方法介绍2.1 comparator()2.2 subSet(E fromElement, E toElement)2.3 headSet(E toElement)2.4 tailSet(E fromElement)2.5 first()2.6 last()1.概述定义了一个有序的Set接口,Java里有很多Set的实现类。其中TreeSet就是继承了这个接口。默认按照key值升序来构建。可以实现一个比较器,在初始化TreeSet的时候传入。2. 接口方法介绍2.1 com原创 2020-09-20 21:29:33 · 152 阅读 · 0 评论 -
JDK源码分析---SortedMap
文章目录1.概述2.接口方法介绍2.1 comparator()2.2 subMap(K fromKey, K toKey)2.3 headMap(K toKey)2.4 tailMap(K fromKey)2.5 firstKey()2.6 lastKey()2.7 keySet();2.8 values()2.9 entrySet()1.概述定义了一个有序的Map接口,Java里有很多Map的实现类。其中TreeMap就是继承了这个接口。默认按照key值升序来构建。可以实现一个比较器,在初始化Tre原创 2020-09-18 21:01:03 · 335 阅读 · 0 评论 -
JDK源码解析---Stack
文章目录1.概述2.类图3.主要方法3.1push3.2 pop3.3 peek3.4 empty3.5 search1.概述Stack是栈的实现类,栈的特点是先进后出。继承了Vector,重写了5个方法,对Vector进行了扩展。2.类图继承了Vector3.主要方法3.1push调用父类的addElement方法,添加到数组的尾部,也就是栈顶public E push(E item) { addElement(item); return item;}3.2 po原创 2020-09-17 20:10:38 · 199 阅读 · 0 评论 -
JDK源码解析---Queue
文章目录1.概述2.特点2.1 ArrayDeque2.2 LinkedList2.3 PriorityQueue1.概述Queue在java中是一个接口,规定了一些队列实现的基本操作。Queue是一个队列,先进先出。他有一个子接口是Deque,是一个双端队列。可以在两端进行进出操作。本文着重比较java.util包下实现这两个接口的类的特点。首先来看看java.util包下有哪些实现这两个接口的类。ArrayDequeLinkedListPriorityQueue2.特点2.1 Ar原创 2020-09-16 13:06:48 · 243 阅读 · 0 评论 -
JDK源码解析---Vector
文章目录1.概述2.类图3.属性4.构造方法5.方法介绍5.1 copyInto5.2 trimToSize5.3 ensureCapacity5.4 setSize5.5 capacity5.6 size5.7 isEmpty5.8 elements5.9 contains5.10 lastIndexOf5.11 elementAt5.12 firstElement5.12 lastElement5.13 setElementAt5.14 remove & removeElementAt5.15原创 2020-09-15 16:42:48 · 181 阅读 · 0 评论 -
JDK源码解析---ConcurrentHashMap
文章目录1.概述2.concurrentHashMap1.7与1.8的区别2.1锁的机制不同2.2 数据结构不同3.类图4.属性5.node6.静态工具方法6.1 spread6.2 tableSizeFor6.3 comparableClassFor6.4 compareComparables6.5 tabAt6.6 casTabAt6.7 setTabAt7.构造函数7.1 无参构造函数7.2 ConcurrentHashMap(int initialCapacity)7.3 ConcurrentHas原创 2020-09-14 21:42:11 · 250 阅读 · 0 评论 -
JDK源码解析---TreeSet
文章目录1. 概述2. 类图3. 属性4. 构造方法5. 添加单个元素6. 移除单个元素7. 查找单个元素8. 查找接近的元素9. 获得首尾的元素10. 清空11. 克隆12. 获得迭代器13. 转换成 Set/Collection14. 查找范围的元素1. 概述由于 SortedSet 接口能对元素升序排序(也叫自然排序),TreeSet 类也会对实现了Comparable接口 的类的对象自动排序,或者根据创建 TreeSet 时提供的 Comparator 进行排序;底层依赖于 TreeMap,原创 2020-08-19 10:24:20 · 347 阅读 · 0 评论 -
JDK源码解析---TreeMap
文章目录1. 概述2. 类图3. 属性4. 构造方法5. 添加单个元素6. 获得单个元素7. 删除单个元素8. 自平衡8.1插入后自平衡8.2 删除后自平衡9. 查找接近的元素10. 获得首尾的元素11. 清空12. 克隆13. 序列化14. 反序列化15. 转换成 Set/Collection15.1 keySet15.2 descendingKeySet15.3 values15.4 entrySet1. 概述TreeMap ,按照 key 的顺序的 Map 实现类。采用红黑树实现 红黑树具有以下原创 2020-08-18 20:35:43 · 428 阅读 · 0 评论 -
JDK源码解析---LinkedHashSet
文章目录1.概述2.类图3.构造函数1.概述LinkedHashSet是Set集合的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,也就是我们插入的顺序。底层实现是LinkedHashMap 所以仅在构造方法上和HashSet有所区别LinkedHashMap和LinkedHashSet都可以做到有序,但是不同点在于。LinkedHashMap可以根据访问顺序来访问,也可以根据插入顺序来访问。但是LinkedHashSet有序的访问只能是根据插入顺序来访问。2.类图继承了Has原创 2020-08-17 09:51:57 · 243 阅读 · 0 评论 -
JDK源码解析---HashSet
文章目录1.概述2.类图3. 属性4.构造方法4.1 无参构造4.2 带集合参数的构造4.3 初始容量和装载因子的构造4.4 初始容量的构造5. 获得集合迭代器6. 返回集合大小7. 判断是否为空8. 判断对象存不存在9. 添加元素10.移除元素11.清空集合1.概述内部组合了一个HashMap,所有的操作都是基于HashMap的操作。因为HashSet存的值对应HashMap中的key,所以是唯一的。HashSet是无序的。了解HashSet的源码都是和HashMap相关。底层调用HashMap原创 2020-08-15 12:20:36 · 270 阅读 · 0 评论 -
JDK源码解析---HashTable
文章目录1.概述2.类图3.属性4.构造方法5.简单的基本方法6.查找6.1 contains(Object value)6.2 containsValue(Object value)6.3 containsKey(Object key)6.4 get(Object key)7.添加单个结点7.1 addEntry(int hash,K key,V value,int index)7.2 put(K key,V value)8.扩容rehash()9.移除9.1remove(Object key)9.2cl原创 2020-08-14 10:46:48 · 267 阅读 · 0 评论 -
JDK源码解析---HashMap
文章目录1. 概述2. jdk1.7与jdk1.8 HashMap的区别3. 类图4. 属性5. 构造方法6. 哈希函数7. 添加元素7.1 添加单个元素7.2 批量添加7.3没有才添加8. 删除元素9. 树化10. 扩容11. 查找11.1 根据key键来查找11.2 根据value来查找。11.3 getOrDefault12.清空1. 概述HashMap是一个散列表,它存储的的是键值对的映射关系。HashMap的实现不是同步的,是线程不安全的,但是效率高。查找的平均时间 复杂度达到了O(1)。原创 2020-08-13 12:39:33 · 251 阅读 · 0 评论 -
JDK源码解析---LinkedList
文章目录1.概述2.类图3.属性4.构造方法5.添加元素5.1添加单个元素5.2添加多个元素6.删除元素7.获取元素8.判断是否包含某元素9.计算链表长度10.修改元素11.序列化链表12.反序列化链表13.克隆1.概述LinkedList ,是基于节点实现的双向链表的 List ,每个节点都指向前一个和后一个节点从而形成链表。LinkedList提供队列、双端队列、栈的功能。LinkedList随机访问的平均时间复杂度为O(n),查找指定元素的平均时间复杂度为O(n)。LinkedList移除指原创 2020-08-12 09:35:54 · 345 阅读 · 0 评论 -
JDK源码解析---AbstractSet
文章目录1.概述2.类图3.基本方法3.1删除集合中所有元素3.2 重写hashCode3.3 重写equals1.概述AbstractSet抽象类属于Set集合分支的顶层类。这个类中有且定义了三个方法2.类图它继承了AbstractCollection,实现了Set接口一些集合的通用方法在这个类中并没有去重写。3.基本方法3.1删除集合中所有元素public boolean removeAll(Collection<?> c) {//给定集合c Objects.req原创 2020-08-10 21:03:15 · 318 阅读 · 0 评论 -
JDK源码解析---AbstractMap
文章目录1.概述2.类图3.属性4.构造方法5.基本方法6.简单的Entry实现1.概述AbstractMap 是 Map接口的的实现类之一,也是 HashMap, TreeMap, ConcurrentHashMap 等类的父类。AbstractMap 提供了 Map 的基本实现,使得我们以后要实现一个 Map 不用从头开始,只需要继承 AbstractMap, 然后按需求实现/重写对应方法即可。2.类图仅实现了Map接口,Map接口定义了一些关于map集合的基本操作。AbstractMap需原创 2020-08-09 10:06:40 · 342 阅读 · 0 评论 -
JDK源码解析---AbstractList
文章目录1.概述2.类图3.构造方法4.基本方法5.迭代器5.1构造方法5.2 Itr5.2.1成员变量5.2.2基本方法5.3 ListItr5.3.1 构造方法5.3.2 基本方法6 子列表subList1.概述AbstractList是List的抽象实现,简单实现了一些关于List的基本操作。2.类图继承了AbstractCollection抽象集合类,AbstractCollection是java自己提供的一个最基本的Collection的实现。当然它依然是一个抽象类。对于一个不可更改原创 2020-08-08 14:25:41 · 240 阅读 · 0 评论 -
JDK源码解析---ThreadLocal
文章目录1.概述2.属性3.内部类 ThreadLocalMap3.1属性3.2构造方法3.3方法4.set方法5.get方法6.remove方法7.应用场景8.内存泄漏问题1.概述维持线程封闭性除了Ad-hoc封闭和栈封闭,更规范的方法是使用ThreadLocal,这个类是java lang包下的一个类。他能使线程中的某个值与保存值的对象关联起来。ThreadLocal提供了get set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立地副本,因此get总能返回由当前执行线程在调用set原创 2020-08-05 10:21:37 · 246 阅读 · 0 评论 -
JDK源码解析---Thread
文章目录1.概述2.类图3.属性4.构造方法5.本地方法6.常用方法7.线程状态1.概述Java所有多线程的实现,均通过封装Thread类实现2.类图实现了Runnable接口Runnable的源码非常简单,只有一个抽象方法。@FunctionalInterface是jdk1.8出现的函数式接口。用于Lamda表达式。可以把Runnable看作是一个任务,run方法就是任务要完成的事情3.属性private volatile char name[];//线程的名字private int原创 2020-08-04 11:11:15 · 281 阅读 · 0 评论 -
JDK源码解析---Short
文章目录1.概述2.类图3.属性4.构造方法5.缓存6.toXXXString7.parseXXX8.valueOf9.XXXValue10.hashCode11.其他方法1.概述Short是short的包装类,最大值为2^15-1 ,最小值为-2^15。对基本数据类型short进行封装,提供了一些处理short数据类型的数据的方法。2.类图继承了Number,实现了数值类型转换的方法实现了Comparabel接口对Float对象进行比较实现了Serializable序列化接口3.属性静态原创 2020-08-02 10:17:40 · 901 阅读 · 0 评论 -
JDK源码解析---Long
文章目录1.概述2.类图3.属性4.构造方法5.缓存6.toXXXString7.stringSize 求long数据的长度8. parseXXX9.valueOf10.XXXValue 转换成其他类型的数值返回11.hashCode12.其他方法1.概述Long是long的包装类,最大值为最大值为263-1,最小值为-263。提供了对基本数据类型long进行封装,提供了一些处理long数据类型的数据的方法。2.类图继承了Number,实现了数值类型转换的方法实现了Comparabel接口对Fl原创 2020-08-01 11:16:32 · 498 阅读 · 0 评论 -
JDK源码解析---Integer
文章目录1.概述2.类图3.属性4.构造方法5.缓存6.toXXXString7. 求Integer数值的长度8.parseXXX9.valueOf10.XXXValue 转换成其他类型的数值返回11.hashCode12.其他方法1.概述Integer是int的包装类,最大值为231-1,最小值为-231。Integer类主要的作用就是对基本类型int进行封装,提供了一些处理int类型的方法。2.类图和其他包装类一样,继承了Number,实现了数值类型转换的方法实现了Comparabel接口原创 2020-07-31 10:59:44 · 602 阅读 · 0 评论 -
JDK源码解析---Float
文章目录1.概述2.类图3.属性4.构造方法5.toString/toHexString6.valueOf7.parseFloat8.isXXX9.XXXValue10.hashCode11.比较12.其他方法1.概述Float是float的包装类,用于表示单精度浮点数。Float的表示方法和int、short、long不同。Float满足IEEE754浮点数表示法。Float表示的数值占4个字节,共32位。其中0到22位表示尾数部分;23到31位表示指数部分;32位为符号位。Float被final原创 2020-07-30 09:30:35 · 240 阅读 · 0 评论 -
JDK源码解析---Double
文章目录1.概述2.类图3.属性4.构造方法5.常用方法6.其他方法1.概述Double类是基本类型double的包装类。double 双精度浮点数在内存内占 8 个字节,用 64 位二进制描述。2.类图继承了Number类,可以用于数字类型的一系列转换实现了Comparable接口,可以用于比较实现了序列化接口,用于序列化和反序列3.属性静态常量,可直接通过类名.来调用public static final double POSITIVE_INFINITY = 1.0 / 0.0;原创 2020-07-24 10:47:19 · 339 阅读 · 0 评论 -
JDK源码解析---Byte
文章目录1.概述2.类图3.属性4.构造方法5.ByteCache6.valueOf7.decode8.XXValue()9.toString10.hashCode11.equals/compareTo(Byte anotherByte)1.概述 byte是java基本数据类型之一,是java中长度最小的基本数字类型,并且我们在读写文件时经常使用byte数组,Byte是其包装类,由final修饰不可被继承。很多方法的实现借助了Integer类。2.类图继承了Number类,可以用于数字类型的一原创 2020-07-23 11:04:40 · 257 阅读 · 0 评论 -
JDK源码解析---Boolean
文章目录1.概述2.类图3.属性4个常量4.构造方法5.其他方法5.1返回value5.2 转换5.3 哈希计算5.4 比较equals5.5 获取Java系统属性5.6 比较compareTo5.7 与/或/异或1.概述 Java的Boolean对象是对boolean基本数据类型的封装,有着一个字段存放对应的boolean数据值,提供了许多方法方便对boolean进行操作。2.类图实现了序列化接口和可比较接口3.属性4个常量Boolean类型的 常量TRUEBoolean类型的 常量原创 2020-07-23 10:07:14 · 226 阅读 · 0 评论 -
JDK源码解析---StringBuilder
文章目录1.概述2.类图3.属性4.构造方法5.append方法6.删除7.替换8.insert方法9.匹配10.翻转1.概述 StringBuilder和StringBuffer一样,都是继承自抽象类AbstractStringBuilder类,也是一个可变的字符序列。StringBuilder和StringBuffer非常相似,甚至有互相兼容的API,不过,StringBuilder不是线程安全的,这是和StringBuffer的主要区别。 StringBuilder类被设计成在不需要多线程安原创 2020-07-22 10:04:38 · 230 阅读 · 0 评论 -
JDK源码解析---StringBuffer
文章目录1.概述2.类图3.属性4.构造方法5.缓冲区的大小和内容长度6.扩容/缩容7.获取字符/获取代码点8.getChars/setCharAt9.append10.删除11.替换12.截取子串13.插入14.匹配15.toString1.概述 StringBuffer,由名字可以看出,是一个String的缓冲区,也就是说一个类似于String的字符串缓冲区,和String不同的是,它可以被修改,而且是线程安全的。但是多个线程同时操作StringBuffer时候,对它而言只有一个线程在进行操作是串原创 2020-07-21 10:37:35 · 260 阅读 · 0 评论 -
JDK源码解析---AbstractStringBuilder
文章目录1. 概述2.类图3.属性4.构造方法5.返回长度/大小6.扩容7.缩容8.得到字符9.得到子字符串/子序列10.修改字符11.追加字符串12.插入字符串13.删除14.查找15.翻转字符串1. 概述这个抽象类是StringBuilder和StringBuffer的直接父类,实现了两个接口分别是Appendable, CharSequenceCharSequence是一个字符序列的接口,主要提供了一下的方法该接口规定了需要实现该字符序列的长度:length();可以取得下标为in原创 2020-07-20 11:34:59 · 322 阅读 · 0 评论 -
JDK源码解析---String
文章目录1.概述1.1 不变性1.2 字符串乱码2.取子串3.相等判断4.替换、删除5.拆分和合并6.匹配1.概述1.1 不变性底层是final修饰的char数组,当修改一个字符串的时候其实是重新得到一个新的字符串,修改引用的地址。public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[];原创 2020-07-17 14:44:02 · 280 阅读 · 0 评论 -
JDK源码解析---Object
文章目录1.概述2.registerNatives()3.getClass()4.notify()、notifyAll()5.wait(long timeout)、wait(long timeout, int nanos)、wait()6.hashCode()hash值需要遵守的约定:7.equals(Object obj)8.clone()9.toString()10.finalize()1.概述Object类是所有类的父类(包括数组),Object类中共有12个方法(除了init和cinit以外),原创 2020-07-17 09:55:51 · 223 阅读 · 0 评论 -
JDK源码阅读计划
计划阅读顺序如下,优先级1-4,完成一个写一篇博客1、java.langObject 1String 1AbstractStringBuilder 1StringBuffer 1StringBuilder 1Boolean 2Byte 2Double 2Float 2Integer 2Long 2Short 2Thread 2ThreadLocal 2Enum 3Throwable 3Error 3Exception 3Class 4ClassLoader 4C原创 2020-07-17 09:20:46 · 472 阅读 · 1 评论 -
JDK源码解析---LinkedHashMap
文章目录1. 概述2. 类图3. 属性4. 构造方法5. 创建结点6. 节点操作回调6.1 afterNodeAccess6.2 afterNodeInsertion6.3 afterNodeRemoval7. 替换节点8. 清空9. 判断是否包含1. 概述LinkedHashMap 是 HashMap 的子类,增加了顺序访问的特性。【默认】当 accessOrder = false 时,按...原创 2020-04-13 19:42:31 · 258 阅读 · 0 评论 -
JDK源码解析---ArrayList
文章目录前言1.概述2.类图3.属性4.构造方法5.缩容方法6.扩容方法7.获取大小8.判断是否为空9.判断是否含有某对象10.克隆11.ArrayList转数组12.返回指定索引的元素13.修改指定索引位置的元素14.添加元素15.删除元素16.添加所有17.删除范围内的元素18.越界检查19.删除批量元素20.序列化21.反序列化22.创建迭代器前言最近在看芋道源码解析,顺带就自己跟着整理...原创 2020-03-07 22:58:20 · 293 阅读 · 0 评论