hello,大家好,我是小护士。今天是小护士青铜上分系列第一篇开山大作,请大家多多支持。为什么叫青铜上分,因为小护士目前就在青铜段位。怎么定义青铜段位?如果你对自己编程语言已经做到熟练使用语法糖,能够使用它做数据库增删改查(JDBC、JPA、MyBatis),能够使用它提供基于http协议的网络服务(Spring MVC、Netty),能够使用它完成产品经理那些千奇百怪的需求;但是对源码细节、实现原理、设计思想还不太了解的,那么你就处于青铜段位了。
阅读lang包前,先准备好Java8的JDK源码,源码可以直接从OpenJDK官网或Github仓库下载,或者直接解压JDK下src.zip文件。然后是准备IDEA社区版或Eclipse,把代码导入进去,方便阅读时做代码跳转。最后是在浏览器打开Java API手册,用来做源码阅读导航。
三步走:
1. 下载JDK源码
2. IDEA或Eclipse导入工程
3. 打开Java API手册
读源码如同航海,需要把握好方向,大部分情况是广度优先遍历,极少数重点代码逻辑需要深度优先遍历。有些地方如果不是面试重点并且需要花费大量时间才能弄懂的,可以先选择忽略不看,并列入待阅读清单;这个会在后面lang包代码修行特别说到。小护士阅读源码的目的有两个,一个是为了跳槽面试涨工资,另一个是为了纯粹的求知。生活向来不易,先应付好面试再说。
所以小护士在后续的篇章中大体上会以“基本结构”、“面试重点”、“代码修行”来解析源码;这也代表了小护士对源码理解深度的三个层次吧。
对于lang包来说,只需要关注接口和类就可以了。其他注入枚举、异常等,需要的时候才去看也行。上面加粗的就是面试会问到的接口和类。
既然在上面已经圈出面试重点内容,那下面就先简单介绍个大概。
小护士按照优先级分组排列一下:
Thread
ThreadGroup
ThreadLocal
Runnable
线程Thread
由线程组ThreadGroup
来管理,线程的Runnable
实现类在被多个线程共用情况下,那些线程处理该类字段时就会有线程安全问题发生,为了线程之间互不影响,于是诞生了ThreadLocal
类来实现线程间Runnable
实现类字段资源隔离,每条线程都有自己完整的一份数据拷贝,互不影响。至于ThreadLocal
实现细节将会在后面的篇章介绍到。
String
StringBuffer
StringBuilder
字符串String
是用字符数组char[]
实现的,但是因为该数组是个常量,所以也定义了Java字符串也是常量,一旦创建就不可以变更。因此催生出了第一个可变字符串工具类StringBuffer
,它采用建造者模式,对append()
和insert()
方法做synchronized
关键字修饰,也就是做了同步互斥处理。但因为每次添加字符串都要检查锁,非常消耗性能,而且大部分该类的使用场景都是在方法内作为本地变量来调用,所以催生出了一个非线程安全版本的StringBuilder
。
Boolean
Byte
Double
Integer
Long
Number
Object
Enum
Void
Class
ClassLoader
这里说浅可以很浅,说深可以深入到C++源码的markOops
对象头结构,还有双亲委派模型的类加载机制。小护士也会在后面专门讲解这块。
Cloneable
Comparable
Iterable
Math
Cloneable
接口通常与浅拷贝和深拷贝有关系,而深拷贝则会与Java对象序列化反序列化技术直接相关,把这块讲清楚起码要独立写一篇博文才行,毕竟要深入到实现原理上。Comparable
接口是排序用的,代码虽然简单,但是设计很经典。Iterable
接口通常与Java集合包相关联,目的是为了提供一个迭代器对象,使用迭代器模式遍历数组元素。Math
类用于数学计算,平时更多是用它的random()
方法,而这里又会涉及到util包的Random
类实现细节。lang包除了上面几个面试重点内容以外,还有其他几个类是小护士推荐在工作闲暇之余研究的:
CharSequence
Character
Compiler
Process
ProcessBuilder
Runtime
SecurityManager
System
这些都是偏向操作系统层面的类,需要花点时间去研究背后的C++代码怎么处理。
这些子包将会在后续博文中逐一介绍,其中,ref包和reflect包是面试重点内容。
写到这里,第一篇《Java8源码阅读》就完成了,虽然只是对lang包做了简单的结构解析,但起码对java的核心包有了大概的了解,知道哪块是哪块,在脑海中形成一个清晰的学习路线图。
为了方便大家日后技术交流,小护士在这里特别推荐如下交流方式:
QQ群:JAVA高级交流(329019348)
QQ群:大宽宽的技术交流群(317060090)
如果有对博文内容有任何技术问题,欢迎评论留言或加群讨论,谢谢大家。