Java源码
文章平均质量分 79
Jakob_Hu
当你无助时
展开
-
基础篇:String源码解析
String类型解析1.不变性概念源码2.字符串乱码3.首字母大小写4.判断字符串相等5.替换、删除6.拆分和合并拆分拼接知识点1.不变性概念HashMap的键值在使用中建议使用不可变类,如String。**“不可变”**指的是类对象的值一旦被初始化就不能再被改变。假设某个变量指向一个不可变类对象的引用,如果变量引用的值被改变,则会指向一个新的类对象。String s = "hello";...原创 2019-09-12 15:43:13 · 459 阅读 · 0 评论 -
基础篇:Long源码解析
Long源码解析1.缓存2.valueOf与parseLong1.缓存缓存问题是Long对象最受关注的问题,Long自身实现了一种缓存机制,缓存了从-128到127内所有的Long值,如果是这个范围内的Long值,就不会初始化,而是从缓存中拿取。缓存初始化源码如下,private static class LongCache { private LongCache(){} ...原创 2019-09-12 16:28:28 · 663 阅读 · 0 评论 -
集合篇:List—ArrayList源码解析
ArrayList源码解析1.整体架构2.源码解析初始化ArrayList是常用的结构,也是面试过程中可能被问到的知识点,需要对源码的细节进行了解。1.整体架构ArrayList整体架构比较简单,是一个数组结构,上图展示的是长度为10的数组(10也是ArrayList的默认最小初始化长度),ArrayList关键成员变量如下,变量名说明elementData数组本...原创 2019-09-14 01:58:52 · 386 阅读 · 0 评论 -
集合篇:List—LinkedList源码解析
LinkedList源码解析1.整体架构2.源码解析查询节点(依据索引)LinkedList查找元素方法调用形式添加元素linkLast方法尾部添加linkFirst方法头部添加linkBefore方法添加到指定节点前LinkedList的添加元素方法调用形式删除节点unlinkFirst方法头部删除节点unlinkLast方法尾部删除节点unlink方法删除指定节点LinkedList对象rem...原创 2019-09-14 18:33:41 · 417 阅读 · 0 评论 -
集合篇:Map—HashMap源码解析
HashMap源码解析1.整体架构2.源码解析类属性添加键值对链表新增节点过程红黑树新增节点过程1.整体架构HashMap底层的结构是数组+链表+红黑树。当链表长度≥8且数组长度≥64时,底层代码会将链表转化为红黑树。当红黑树的节点数≤6时,底层代码又会将红黑树转化为链表。下面展示的是节点Node和TreeNode(可以理解为链表和红黑树)的源码,这两个都是HashMap类中定义的内部类,...原创 2019-09-17 13:48:56 · 594 阅读 · 0 评论 -
集合篇:Map—TreeMap源码解析
TreeMap源码解析1.TreeMap整体架构知识储备Comparable接口法外部排序器Comparator类属性添加新元素查找节点总结1.TreeMap整体架构TreeMap依据key值对其中的元素进行排序。其底层结构与HashMap一样是红黑树。TreeMap利用了红黑树左节点小,右节点大的性质对key进行排序,使得每个元素能够插入到红黑树的适当位置。适用于key需要排序的场景。因为...原创 2019-09-17 21:55:10 · 159 阅读 · 0 评论 -
集合篇:Map—LinkedHashMap源码解析
LinkedHashMap1.整体架构2.源码解析按顺序新增元素按顺序访问元素删除最少访问总结1.整体架构HashMap是无序的,TreeMap可以按照key进行排序,LinkedHashMap可以维护key插入顺序。LinkedHashMap本身继承HashMap,所以拥有HashMap的全部特性,此外在其基础上提供了两大特性:按照插入顺序进行访问实现了最先删除最少访问的功能,目的是...原创 2019-09-19 14:12:24 · 265 阅读 · 0 评论 -
集合篇:Set—HashSet源码解析
HashSet源码解析1.HashSet整体架构2.HashSet组合HashMap的方法总结Java中的HashSet和TreeSet两个类都是在Map的基础上组装而来的。侧重点也在于Set如何利用Map现有的功能实现自身的设计。1.HashSet整体架构HashSet是对HashMap进行组装后的产物,源码文件中对该类的描述具体有如下四点,底层实现基于HashMap,所以迭代过程中不...原创 2019-09-19 20:56:04 · 280 阅读 · 0 评论 -
集合篇:Set—TreeSet源码解析
TreeSet源码解析1.整体架构2.源码解析复用思路1复用思路2总结复用思路总结什么场景下使用TreeSet1.整体架构TreeSet的结构大致与HashSet相似,底层依旧使用组合的方式,组合基础类TreeMap。所以能够对key进行排序。迭代的时候能够按照key的排序顺序进行迭代。2.源码解析TreeSet复用TreeMap的两种思路,复用思路1这一思路与HashSet复用Has...原创 2019-09-19 21:41:10 · 303 阅读 · 0 评论 -
集合篇:提升集合性能及避坑
提升集合性能及避坑1.批量新增和删除批量新增批量删除2.集合类避坑强制实现equals和hashCode方法统一使用迭代器的方法对集合进行修改数组转集合的坑集合转数组的坑1.批量新增和删除对应的是集合类的addAll和removeAll方法。批量新增在向List和Map中新增大量数据时,应当避开使用for循环逐一添加的方式,应当尽量使用addAll和putAll方法,具体演示如下,@Te...原创 2019-09-24 21:45:19 · 322 阅读 · 0 评论 -
集合类:Java7和Java8中集合类差异
Java7和Java8中集合类差异1. 通用区别2.List区别3.Map区别HashMap的区别LinkedHashMap总结Java8在Java7的基础上对集合类进行了改进和优化,但是使用过程与Java7并没有什么不同,这一点是值的学习借鉴的。1. 通用区别Map、Set和List在Java8中均添加了forEach方法,该方法的入参是Consumer,一个函数式接口,可以简单理解为允许...原创 2019-09-24 22:17:20 · 503 阅读 · 0 评论 -
并发集合类:CopyOnWriteArrayList源码解析
CopyOnWriteArrayList源码解析1.整体架构2.源码解析新增元素尾部新增元素添加至某索引处批量添加删除元素索引位置删除批量删除其他方法indexOf方法迭代总结ArrayList在作为共享变量存在时,是线程不安全的。JDK中保证对ArrayList操作是线程安全的方法有如下3种,编程过程中对共享变量进行操作的代码自行加锁使用Collections.synchronizedL...原创 2019-09-26 21:41:05 · 171 阅读 · 0 评论 -
并发集合类:ConcurrentHashMap源码解析
ConcurrentHashMap类源码解析1.总体架构类注释信息结构2.源码解析put方法1.总体架构类注释信息所有操作都是线程安全的,在使用ConcurrentHashMap的过程中不需要额外加锁多个线程同时进行put、remove操作时不会阻塞迭代过程中,即使Map的结构被修改也不会抛出ConcurrentModificationException除了数组、链表和红黑树外,新增...原创 2019-10-06 20:45:25 · 283 阅读 · 0 评论 -
队列:LinkedBlockingQueue源码解析
LinkedBlockingQueue源码解析1.整体架构Queue接口和BlockingQueue接口类注释内部结构队列是很重要的API,线程池、读写锁、消息队列等技术和框架的底层原理都是队列,是很多高级API的基础。1.整体架构LinkedBlockingQueue,链表阻塞队列,底层的数据结构时链表,且队列是可阻塞的。Queue接口和BlockingQueue接口从类关系图中可以...原创 2019-10-11 15:20:01 · 447 阅读 · 0 评论 -
队列:DelayQueue源码解析
DelayQueue源码解析1.整体结构2.使用演示3. 源码解析数据存入队列—put方法队列取出数据—take方法与大多数阻塞队列不同,DelayQueue是一种延迟队列。一般的队列当资源足够时立马执行,而DelayQueue到达设定的延迟时间后才会执行。1.整体结构DelayQueue延迟队列底层使用的是锁的能力,在多线程操作时也具备安全性。DelayQueue类注释中提及的3个关键概...原创 2019-10-21 22:13:46 · 432 阅读 · 0 评论 -
队列:ArrayBlockingQueue源码解析
ArrayBlockingQueue源码解析整体架构整体架构数组阻塞队列的类注释信息如下,底层是有界数组(不能扩容),容量一旦初始化,后续无法修改队列中元素是有顺序的,按照先入先出进行排序,从队伍插入数据,从队头拿出数据队列满时,放数据会被阻塞;队列空时,取数据会被阻塞该类中几个重要的对象,// 数组大小必须在初始化的时候手动设置,没有默认大小final Object[] it...原创 2019-10-22 00:57:06 · 172 阅读 · 0 评论 -
队列:SynchronousQueue源码解析
SynchronousQueue源码解析1. 整体架构2.源码解析非公平堆栈SynchronousQueue是队列中最特殊的队列,它本身没有容量大小,将一个元素放入到队列中后无法立刻返回。直到其他线程将放入的元素消费掉才能够返回。SynchronousQueue在消息队列技术中间件中被大量使用,其内部同时使用两种数据结构实现队列,分别是FIFO的队列和FILO的堆栈。分别对应两个内部类Tran...原创 2019-10-24 10:06:33 · 225 阅读 · 0 评论 -
队列:队列在Java中的应用
队列在Java中的应用1. 队列和线程池队列在线程池中的作用—存放任务请求线程池中的队列类型1)LinkedBlockingQueueSynchronousQueueDelayedWorkQueue2. 队列和锁队列在锁中的作用—管理争锁失败的线程Java的线程池直接使用了队列的API,锁借鉴了队列的思想,重新实现了队列。所以队列在这两个的实现上都发挥了关键作用。1. 队列和线程池队列在线程...原创 2019-10-25 01:26:18 · 1961 阅读 · 0 评论 -
线程:Thread类源码解析(上)
Thread类源码解析1.基本架构类注释线程状态1)NEW2)RUNNABLE3)RUNNING4)BLOCKED5)TERMINATED6)WAITING和TIMED_WAITING优先级守护线程ClassLoader2.初始化方法1.基本架构Thread类涉及较多基本概念,理解基本概念是读源码的前提。类注释每个线程都有优先级,高优先级的线程可能会优先执行父线程创建子线程后,子线程的...原创 2019-11-01 00:56:34 · 485 阅读 · 0 评论 -
线程:Thread类源码解析(下)
Thread类源码解析4.Thread APIsleep方法yield方法setPriority方法interrupt方法*Join方法4.Thread APIsleep方法sleep 方法会使线程休眠指定的时间长度。休眠的意思是,当前逻辑执行到此不再继续执行,而是等待指定的时间。但在这段时间内,该线程持有的 monitor 锁(锁在以后的笔记中讲解)并不会被放弃。可以认为线程只是工作到一...原创 2019-11-01 01:30:01 · 204 阅读 · 0 评论 -
线程:Future、ExecutorService源码解析
Future、ExecutorService源码解析1.整体架构2.Callable接口3.FutureTask类Future接口RunnableFuture接口统一Callable和Runnable1)FutureTask类定义2)FutureTask类属性3)FutureTask构造器4)Runnable适配CallableFutureTask对任务的管理1)get方法2)run方法3)can...原创 2019-11-08 22:31:48 · 541 阅读 · 0 评论 -
线程:并发中可能存在的问题
并发中可能存在的问题1. 并发编程三大特性2. 原子性竞态条件3. 可见性缓存不一致性CPU缓存模型Volatile关键字4.有序性指令重排实例5. 问题根源—JMM模型1. 并发编程三大特性并发编程的三大特性实际上是并发编程中所有问题的根源,原子性所有操作要么全部成功,要么全不成功可见性一个线程对变量的修改,其余的线程能够立刻读取到变量的最新值有序性代码在执行阶段的执行顺序与程...原创 2019-11-10 15:51:09 · 1245 阅读 · 2 评论 -
线程:并发问题的解决
并发问题的解决1. 实现原子性Atomic1)Atomic概述2)Atomic源码分析构造方法increamentAndGet方法CAS算法1)CAS与synchronized差异2)CAS算法缺点2. 实现可见性和有序性volatile效果理解volatile1)保证可见性2)保证有序性3)无法保证原子性volatile使用场景并发的三大特性是在并行开发中一定要保证的。最简单的保证这三个特性...原创 2019-11-10 21:54:53 · 1016 阅读 · 0 评论 -
线程:synchronized原理及使用
synchronized原理与使用1. synchronized作用2. synchronized使用同步代码块同步方法synchronized使用总结3. sychronized原理4. synchronized注意事项1. synchronized作用能够保证原子性的Atomic变量和保证可见性、有序性的 volatile关键字是轻量级的实现并发同步的方式,但是都存在着一定的局限,具体参考...原创 2019-11-11 00:36:33 · 578 阅读 · 0 评论 -
锁:AbstractQueuedSynchronizer源码解析(上)
AbstractQueuedSynchronizer源码解析1.整体架构类注释类定义类属性1)一般属性2)同步队列属性3) 条件队列属性4)Node5)共享锁和排它锁的区别Condition接口1)类注释2)条件队列示例3)接口方法2.同步器状态3.获取锁获得排它锁—acquire1)addWaiter方法2)acquireQueued方法setHead方法shouldParkAfterFaile...原创 2019-11-14 15:17:59 · 722 阅读 · 0 评论 -
锁:AbstractQueuedSynchronizer源码解析(下)
AbstractQueuedSynchronizer源码解析1.释放锁释放排它锁—release方法unparkSuccessor方法1.释放锁释放锁是在显式调用Lock.unlock()方法时触发的,目的是让线程释放对资源的访问权。unlock方法的基础方法是release和releaseShared,分别代表排它锁和共享锁的释放。释放排它锁—release方法排它锁的释放过程比较简单,...原创 2019-11-16 21:59:44 · 277 阅读 · 0 评论 -
锁:ReentrantLock源码解析
ReentrantLock源码解析1.整体架构类注释类结构构造方法2.源码解析Sync同步器1)重入性实现原理—nonfairTryAcquire方法2)释放锁—tryRelease方法公平锁—FairSync1)资源加上公平锁—lock方法2)公平锁处理逻辑—tryAcquire方法非公平锁—NonfairSync1)资源加上非公平锁—lock方法2)非公平锁处理逻辑—tryAcquire方法R...原创 2019-11-18 01:22:53 · 696 阅读 · 0 评论 -
线程池:手动实现线程池
手动实现线程池1.创建线程的问题2.线程池概念3.自开发线程池主体架构实现任务队列—RunnableTaskQueue实现线程池—MyExecutor运行线程池1)调用形式12)调用形式21.创建线程的问题并发的本质是任务并行处理,大多数的并发程序围绕离散任务执行来构建。构建的基本思路是对任务进行划分,使得各个不同类型的任务之间相互独立,不存在依赖。这样就可以并行处理任意的任务。在资源无限制...原创 2019-11-25 00:16:02 · 1079 阅读 · 1 评论 -
线程池:Executor框架源码解析(上)
Executor框架使用1.整体架构2.源码解析Executor接口ExecuorService接口AbstractExecutorService1)构建任务—newTaskFor方法2)构建任务并执行—submit方法Java内部提供了线程池Executor框架,其功能比之前笔记中自实现的简易线程池更加全面。1.整体架构Executor框架的整体架构如下,接口/类说明...原创 2019-11-25 20:56:47 · 629 阅读 · 0 评论 -
线程池:Executor框架源码解析(下)
线程池:Executor框架源码解析2.源码解析ThreadPoolExecutor类*5)任务执行—execute方法6)新建Worker并执行任务—addWorker方法更新Worker的数量添加worker到workers集合中并且启动worker持有的线程7)线程任务实际运行—runWorker方法总结1)submit方法整体流程2)线程池整体图2.源码解析ThreadPoolExec...原创 2019-11-25 22:31:58 · 254 阅读 · 0 评论 -
Java8新特性:lambda表达式(上)
lambda表达式1.lambda表达式概述传统实现方式lambda表达式实现2.lambda表达式基础语法函数式接口1.lambda表达式概述lambda表达式是Java8的新特性,也被称为箭头函数、匿名函数、闭包。这种表达式体现的是轻量级函数式编程的思想。->符号是lambda表达式的核心符号,符号左侧是操作参数,符号右侧是操作表达式语句块。lambda表达式出现的目的是在开发过程...原创 2019-12-09 00:58:46 · 660 阅读 · 0 评论 -
Java8新特性:lambda表达式(下)
lambda表达式3.lambda表达式高级拓展方法引用3.lambda表达式高级拓展方法引用方法引用是结合lambda表达式的一组语法特性,具体分为静态方法引用、实例方法引用和构造方法引用。...原创 2019-12-11 01:10:30 · 432 阅读 · 0 评论