Java源码剖析
Java源码剖析
cenghaihengliu
这个作者很懒,什么都没留下…
展开
-
01-String 的特点是什么?它有哪些重要的方法?
String 是如何实现的?它有哪些重要的方法?典型回答以主流的 JDK 版本 1.8 来说,String 内部实际存储结构为 char 数组,源码如下:public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // 用于存储字符串的值 private final char value[]; // 缓存字符串的 hash code原创 2020-06-19 15:22:15 · 202 阅读 · 1 评论 -
02-HashMap 底层实现原理是什么?JDK8 做了哪些优化?
HashMap 是使用频率最高的类型之一,同时也是面试经常被问到的问题之一,这是因为 HashMap 的知识点有很多,同时它又属于 Java 基础知识的一部分,因此在面试中经常被问到。本课时的面试题是,HashMap 底层是如何实现的?在 JDK 1.8 中它都做了哪些优化?典型回答在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图所示:数组中的元素我原创 2020-06-19 15:34:22 · 109 阅读 · 0 评论 -
03-线程的状态有哪些?它是如何工作的?
线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组系统资源,因此线程之间的切换更加节省资源、更加轻量化,也因此被称为轻量级的进程。当然,线程也是面试中常被问到的一个知识点,是程序员必备的基础技能,使用它可以有效地提高程序的整体运行速度。本课时的面试问题是,线程的状态有哪些?它是如何工作的?典型回答线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6 个状态:NE原创 2020-06-19 15:45:05 · 128 阅读 · 0 评论 -
04-详解 ThreadPoolExecutor 的参数含义及源码执行流程?
线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。但如果要说线程池的话一定离不开 ThreadPoolExecutor ,在阿里巴巴的《Java 开发手册》中是这样规定线程池的:线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的读者更加明确线程池的运行规则,规避资源耗尽的风险。说明:Exe原创 2020-06-19 23:53:36 · 138 阅读 · 0 评论 -
05-synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别?
在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。我们本课时的面试题是,synchronized 和 ReentrantLock 是如何实现的?它们有什么区别?典型回答synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronize原创 2020-06-20 11:49:53 · 129 阅读 · 0 评论 -
06-谈谈你对锁的理解?如何手动模拟一个死锁?
在并发编程中有两个重要的概念:线程和锁,多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性,对开发者的要求也提高了一个档次。而锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。当然,在所有的面试中也都少不了关于“锁”方面的相关问题。我们本课时的面试题是,如何手动模拟一个死锁?谈谈你对锁的理解?典型回答死锁是指两个线程同时占用两个资源,又在彼此等待对方释放锁资源,如下图所示:死锁的代码演原创 2020-06-20 11:57:53 · 139 阅读 · 0 评论 -
07-深克隆和浅克隆有什么区别?它的实现方式有哪些?
使用克隆可以为我们快速地构建出一个已有对象的副本,它属于 Java 基础的一部分,也是面试中常被问到的知识点之一。我们本课时的面试题是,什么是浅克隆和深克隆?如何实现克隆?典型回答浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是共享给原型对象和克隆对象的。简单来说就是浅克隆只会复制原型对象,但不会复制它所引用的对象,如下图所示:深克隆(D原创 2020-06-20 12:10:29 · 262 阅读 · 0 评论 -
08-动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?
90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。我们本课时的面试题是,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别?典型回答动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。但动态代理不止有反射一种实现方式,例如,动态代理可以原创 2020-06-20 14:25:46 · 352 阅读 · 0 评论 -
09-如何实现本地缓存和分布式缓存?
缓存(Cache) 是指将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度。以目前的系统架构来说,用户的请求一般会先经过缓存系统,如果缓存中没有相关的数据,就会在其他系统中查询到相应的数据并保存在缓存中,最后返回给调用方。缓存既然如此重要,那本课时我们就来重点看一下,应该如何实现本地缓存和分布式缓存?典型回答本地缓存是指程序级别的缓存组件,它的特点是本地缓存和应用程序会运行在同一个进程中,所以本地缓存的操原创 2020-06-20 18:44:29 · 475 阅读 · 0 评论 -
10-如何手写一个消息队列和延迟消息队列?
第一次听到“消息队列”这个词时,不知你是不是和我反应一样,感觉很高阶很厉害的样子,其实当我们了解了消息队列之后,发现它与普通的技术类似,当我们熟悉之后,也能很快地上手并使用。我们本课时的面试题是,消息队列的使用场景有哪些?如何手动实现一个消息队列和延迟消息队列?典型回答消息队列的使用场景有很多,最常见的使用场景有以下几个。1.商品秒杀比如,我们在做秒杀活动时,会发生短时间内出现爆发式的用户请求,如果不采取相关的措施,会导致服务器忙不过来,响应超时的问题,轻则会导致服务假死,重则会让服务器直接宕机,原创 2020-06-20 19:08:37 · 952 阅读 · 0 评论 -
11-底层源码分析 Spring 的核心功能和执行流程?(上)
Spring Framework 已是公认的 Java 标配开发框架了,甚至还有人说 Java 编程就是面向 Spring 编程的,可见 Spring 在整个 Java 体系中的重要位置。Spring 中包含了众多的功能和相关模块,比如 spring-core、spring-beans、spring-aop、spring-context、spring-expression、spring-test 等,本课时先从面试中必问的问题出发,来帮你更好的 Spring 框架。我们本课时的面试题是,Spring B原创 2020-06-21 21:24:56 · 107 阅读 · 0 评论 -
12-底层源码分析 Spring 的核心功能和执行流程?(下)
上一课时我们讲了 Bean 相关的内容,它其实也是属于 IoC 的具体实现之一,本课时我们就来讲讲 Spring 中其他几个高频的面试点,希望能起到抛砖引玉的作用,能为你理解 Spring 打开一扇门。因为 Spring 涉及的内容和知识点太多了,用它来写一本书也绰绰有余,因此这里我们只讲核心的内容,希望下来你能查漏补缺,完善自己的 Spring 技术栈。我们本课时的面试题是,谈一谈你对 IoC 和 DI 的理解。典型回答IoC(Inversion of Control,翻译为“控制反转”)不是一个具原创 2020-06-21 22:08:52 · 93 阅读 · 0 评论 -
13-MyBatis 使用了哪些设计模式?在源码中是如何体现的?
MyBatis 的前身是 IBatis,IBatis 是由 Internet 和 Abatis 组合而成,其目的是想当做互联网的篱笆墙,围绕着数据库提供持久化服务的一个框架,2010 年正式改名为 MyBatis。它是一款优秀的持久层框架,支持自定义 SQL、存储过程及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,还可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Ordinary Java Object,普通 Java原创 2020-06-21 23:47:21 · 275 阅读 · 0 评论 -
14-SpringBoot 有哪些优点?它和 Spring 有什么区别?
Spring 和 Spring Boot 的区别很多新手容易搞混,从这道简单的面试题也可以很轻易试探出你的 Java 基础功底,如果连这个问题都答不上来的话,通常就没有什么下文了,因为这已经是用人单位对面试者的最低要求了,所以本课时我们就来看一下二者的区别,以及 Spring Boot 的特性。我们本课时的面试题是,Spring 和 Spring Boot 有什么区别?Spring Boot 的优点有哪些?典型回答作为 Java 开发人员对 Spring 框架都很熟悉,Spring 为 Java 程序原创 2020-06-21 23:47:51 · 504 阅读 · 0 评论 -
15-MQ 有什么作用?你都用过哪些 MQ 中间件?
在第 10 课时中讲过“手写消息队列”,当时粗略的讲了 Java API 中使用 Queue 实现自定义消息队列,以及使用 Delayed 实现延迟队列的示例;同时还讲了 RabbitMQ 中的一些基础概念。本课时我们将会更加深入的讲解 MQ(Message Queue,消息队列)中间件,以及这些热门中间件的具体使用。我们本课时的面试题是,MQ 常见的使用场景有哪些?你都用过哪些 MQ 中间件?典型回答在介绍 MQ 的使用场景之前,先来回忆一下 MQ 的作用。MQ 可以用来实现削峰填谷,也就是使用它可原创 2020-06-21 23:48:38 · 379 阅读 · 0 评论 -
16-MySQL 的运行机制是什么?它有哪些引擎?
数据库是 Java 程序员面试必问的知识点之一,它和 Java 的核心面试点共同组成了一个完整的技术面试。而数据库一般泛指的就是 MySQL,因为 MySQL 几乎占据了数据库的半壁江山,即使有些公司没有使用 MySQL 数据库,如果你对 MySQL 足够精通的话,也是会被他们录取的。因为数据库的核心与原理基本是相通的,所以有了 MySQL 的基础之后,再去熟悉其他数据库也是非常快的,那么接下来的几个课时就让我们好好的学习一下 MySQL。我们本课时的面试题是,MySQL 是如何运行的?说一下它有哪些引擎原创 2020-06-22 10:16:49 · 160 阅读 · 0 评论 -
17-MySQL 的优化方案有哪些?
性能优化(Optimize)指的是在保证系统正确性的前提下,能够更快速响应请求的一种手段。而且有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重的后果,轻则造成服务繁忙,重则导致应用不可用。它对我们来说就像一颗即将被引爆的定时炸弹一样,时刻威胁着我们。因此在上线项目之前需要严格的把关,以确保 MySQL 能够以最优的状态进行运行。同时,在实际工作中还有面试中关于 MySQL 优化的知识点,都是面试官考察的重点内容。我们本课时的面试题是,MySQL 的优化方案有哪些原创 2020-06-22 18:52:53 · 670 阅读 · 0 评论 -
18-关系型数据和文档型数据库有什么区别?
关系数据库(Relational Database)是建立在关系模型基础上的数据库,借助于几何代数等数学概念和方法来处理数据库中的数据。所谓关系模型是一对一、一对多或者多对多等关系,常见的关系型数据库有 Oracle、SQL Server、DB2、MySQL 等。而文档型数据库是一种非关系型数据库,非关系型数据库(Not Only SQL,NoSQL)正好与关系型数据库相反,它不是建立在“关系模型”上的数据库。文档型数据库的典型代表是 MongoDB。我们本课时的面试题是,关系型数据库和文档型数据库有什原创 2020-06-22 19:00:05 · 3278 阅读 · 0 评论 -
19-Redis 的过期策略和内存淘汰机制有什么区别?
Redis 和 MySQL 是面试绕不过的两座大山,他们一个是关系型数据库的代表(MySQL),一个是键值数据库以及缓存中间件的一哥。尤其 Redis 几乎是所有互联网公司都在用的技术,比如国内的 BATJ、新浪、360、小米等公司;国外的微软、Twitter、Stack Overflow、GitHub、暴雪等公司。我从业了十几年,就职过 4、5 家公司,有的公司用 MySQL、有的用 SQL Server、甚至还有的用 Oracle 和 DB2,但缓存无一例外使用的都是 Redis,从某种程度上来讲 Re原创 2020-06-22 19:07:54 · 1093 阅读 · 0 评论 -
20-Redis 怎样实现的分布式锁?
“锁”是我们实际工作和面试中无法避开的话题之一,正确使用锁可以保证高并发环境下程序的正确执行,也就是说只有使用锁才能保证多人同时访问时程序不会出现问题。我们本课时的面试题是,什么是分布式锁?如何实现分布式锁?典型回答第 06 课时讲了单机锁的一些知识,包括悲观锁、乐观锁、可重入锁、共享锁和独占锁等内容,但它们都属于单机锁也就是程序级别的锁,如果在分布式环境下使用就会出现锁不生效的问题,因此我们需要使用分布式锁来解决这个问题。分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统原创 2020-06-22 19:16:01 · 129 阅读 · 0 评论 -
21-Redis 中如何实现的消息队列?实现的方式有几种?
细心的你可能发现了,本系列课程中竟然出现了三个课时都是在说消息队列,第 10 课时讲了程序级别的消息队列以及延迟消息队列的实现,而第 15 课时讲了常见的消息队列中间件 RabbitMQ、Kafka 等,由此可见消息队列在整个 Java 技术体系中的重要程度。本课时我们将重点来看一下 Redis 是如何实现消息队列的。我们本课时的面试题是,在 Redis 中实现消息队列的方式有几种?典型回答早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种:使用 List 类型实现使用原创 2020-06-22 20:36:42 · 1084 阅读 · 0 评论 -
22-Redis 是如何实现高可用的?
高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 Redis 作为一款普及率最高的内存型中间件,它的高可用技术也非常的成熟。我们本课时的面试题是,Redis 是如何保证系统高可用的?它的实现方式有哪些?典型回答Redis 高可用的手段主要有以下四种:数据持久化主从数据同步(主从复制)Redis 哨兵模式(Sentinel)Redis 集群(Cluster)其中数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了原创 2020-06-22 20:43:06 · 261 阅读 · 0 评论 -
23-说一下 JVM 的内存布局和运行原理?
JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译的 class 代码(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够“一次编写,到处运行”的原因(因为它会根据特定的操作系统生成对应的操作指令)。JVM 的功能很强大,像 Java 对象的创建、使用和销毁,还有垃圾回收以及某些高级的性能优化,例如,热点代码检测等功能都是在 JVM 中进行的。因为 JVM 是 Java 程序能够运行的原创 2020-06-23 15:18:36 · 219 阅读 · 0 评论 -
24-垃圾回收算法有哪些?
说到 Java 虚拟机不得不提的一个词就是**“垃圾回收”(GC,Garbage Collection)**,而垃圾回收的执行速度则影响着整个程序的执行效率,所以我们需要知道更多关于垃圾回收的具体执行细节,以便为我们选择合适的垃圾回收器提供理论支持。我们本课时的面试题是,如何判断一个对象是否“死亡”?垃圾回收的算法有哪些?典型回答垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法原创 2020-06-23 15:19:09 · 473 阅读 · 0 评论 -
25-你用过哪些垃圾回收器?它们有什么区别?
上一课时我们讲了垃圾回收的理论知识,而本课时将介绍这些理论知识的具体实践。垃圾回收器也叫垃圾收集器,不同的厂商对垃圾收集器的实现也是不同的,这里主要介绍目前使用最广泛的 OracleJDK 中自带的 HotSpot 虚拟机中的几个垃圾收集器。我们本课时的面试题是,你用过哪些垃圾回收器?它们有什么区别?典型回答《Java 虚拟机规范》并没有对垃圾收集器的具体实现做任何的规定,因此每家垃圾收集器的实现方式都不同,但比较常用的垃圾回收器是 OracleJDK 中自带的 HotSpot 虚拟机。HotSpot原创 2020-06-23 15:19:52 · 372 阅读 · 0 评论 -
26-生产环境如何排除和优化 JVM?
通过前面几个课时的学习,相信你对 JVM 的理论及实践等相关知识有了一个大体的印象。而本课时将重点讲解 JVM 的排查与优化,这样就会对 JVM 的知识点有一个完整的认识,从而可以更好地应用于实际工作或者面试了。我们本课时的面试题是,生产环境如何排查问题?典型回答如果是在生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使原创 2020-06-23 15:38:00 · 343 阅读 · 0 评论 -
27-单例的实现方式有几种?它们有什么优缺点?
单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式。它不但被应用在实际的工作中,而且还是面试中最常考的题目之一。通过单例模式我们可以知道此人的编程风格,以及对于基础知识的掌握是否牢固。我们本课时的面试题是,单例的实现方式有几种?它们有什么优缺点?典型回答单例的实现分为饿汉模式和懒汉模式。顾名思义,饿汉模式就好比他是一个饿汉,而且有一定的危机意识,他会提前把食物囤积好,以备饿了之后直接能吃到食物。对应到程序中指的是,在类加载时就会进行单例的初始原创 2020-06-23 15:43:04 · 257 阅读 · 0 评论 -
28-你知道哪些设计模式?分别对应的应用场景有哪些?
上一课时我们讲了单例模式的 8 种实现方式以及它的优缺点,可见设计模式的内容是非常丰富且非常有趣。我们在一些优秀的框架中都能找到设计模式的具体使用,比如前面 MyBatis 中(第 13 课时)讲的那些设计模式以及具体的使用场景,但由于设计模式的内容比较多,有些常用的设计模式在 MyBatis 课时中并没有讲到。因此本课时我们就以全局的视角,来重点学习一下这些常用设计模式。我们本课时的面试题是,你知道哪些设计模式?它的使用场景有哪些?它们有哪些优缺点?典型回答设计模式从大的维度来说,可以分为三大类:创原创 2020-06-23 16:02:22 · 462 阅读 · 0 评论 -
29-红黑树和平衡二叉树有什么区别?
数据结构属于理解一些源码和技术所必备的知识,比如要读懂 Java 语言中 TreeMap 和 TreeSet 的源码就要懂红黑树的数据结构,不然是无法理解源码中关于红黑树数据的操作代码的,比如左旋、右旋、添加和删除操作等。因此本课时我们就来学习一下数据结构的基础知识,方便看懂源码或者是防止面试中被问到。我们本课时的面试题是,红黑树和二叉树有什么区别?典型回答要回答这个问题之前,我们先要弄清什么是二叉树?什么是红黑树?二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大原创 2020-06-23 16:10:48 · 924 阅读 · 0 评论 -
30-你知道哪些算法?讲一下它的内部实现过程?
上一课时我们介绍了数据结构的知识,数据结构属于计算机存储的基础,有了它才能更好地将数据进行存储。而算法可以这样理解:它是为数据结构服务的,使用合适的算法可以更快地操作和查询这些数据。算法的内容有很多,随随便便一本算法书有个 700 页到 1500 页也是很平常的事,因此我们在这里不能把所有的算法问题全部讲到,即使专门再开设一个算法专栏,也只能挑重点的讲。那么我们好钢就要用在刀刃上,本课时会把面试中经常出现的和平常工作中使用频率最高的算法,拿出来给大家分享。我们本课时的面试题是,你知道哪些算法?讲一下它的原创 2020-06-23 16:20:51 · 316 阅读 · 0 评论