小护士青铜上分系列之《Java源码阅读》第一篇lang包概览

小护士青铜上分系列之《Java源码阅读》第一篇lang包概览

hello,大家好,我是小护士。今天是小护士青铜上分系列第一篇开山大作,请大家多多支持。为什么叫青铜上分,因为小护士目前就在青铜段位。怎么定义青铜段位?如果你对自己编程语言已经做到熟练使用语法糖,能够使用它做数据库增删改查(JDBC、JPA、MyBatis),能够使用它提供基于http协议的网络服务(Spring MVC、Netty),能够使用它完成产品经理那些千奇百怪的需求;但是对源码细节、实现原理、设计思想还不太了解的,那么你就处于青铜段位了。

阅读lang包的一般方法

阅读lang包前,先准备好Java8的JDK源码,源码可以直接从OpenJDK官网或Github仓库下载,或者直接解压JDK下src.zip文件。然后是准备IDEA社区版或Eclipse,把代码导入进去,方便阅读时做代码跳转。最后是在浏览器打开Java API手册,用来做源码阅读导航。

三步走:
1. 下载JDK源码
2. IDEA或Eclipse导入工程
3. 打开Java API手册

读源码如同航海,需要把握好方向,大部分情况是广度优先遍历,极少数重点代码逻辑需要深度优先遍历。有些地方如果不是面试重点并且需要花费大量时间才能弄懂的,可以先选择忽略不看,并列入待阅读清单;这个会在后面lang包代码修行特别说到。小护士阅读源码的目的有两个,一个是为了跳槽面试涨工资,另一个是为了纯粹的求知。生活向来不易,先应付好面试再说。

所以小护士在后续的篇章中大体上会以“基本结构”、“面试重点”、“代码修行”来解析源码;这也代表了小护士对源码理解深度的三个层次吧。

lang包基本结构

  • Interfaces(接口)
    • Appendable
    • AutoCloseable
    • CharSequence
    • Cloneable
    • Comparable
    • Iterable
    • Readable
    • Runnable
    • Thread.UncaughtExceptionHandler
  • Classes(类)
    • Boolean
    • Byte
    • Character
    • Character.Subset
    • Character.UnicodeBlock
    • Class
    • ClassLoader
    • ClassValue
    • Compiler
    • Double
    • Enum
    • Float
    • InheritableThreadLocal
    • Integer
    • Long
    • Math
    • Number
    • Object
    • Package
    • Process
    • ProcessBuilder
    • ProcessBuilder.Redirect
    • Runtime
    • RuntimePermission
    • SecurityManager
    • Short
    • StackTraceElement
    • StrictMath
    • String
    • StringBuffer
    • StringBuilder
    • System
    • Thread
    • ThreadGroup
    • ThreadLocal
    • Throwable
    • Void
  • Enums(枚举)
  • Exceptions(异常)
  • Errors(错误)
  • Annotation Types(注解类型)

对于lang包来说,只需要关注接口和类就可以了。其他注入枚举、异常等,需要的时候才去看也行。上面加粗的就是面试会问到的接口和类。

lang包面试重点

既然在上面已经圈出面试重点内容,那下面就先简单介绍个大概。

小护士按照优先级分组排列一下:

1. 线程基础

Thread
ThreadGroup
ThreadLocal
Runnable

线程Thread由线程组ThreadGroup来管理,线程的Runnable实现类在被多个线程共用情况下,那些线程处理该类字段时就会有线程安全问题发生,为了线程之间互不影响,于是诞生了ThreadLocal类来实现线程间Runnable实现类字段资源隔离,每条线程都有自己完整的一份数据拷贝,互不影响。至于ThreadLocal实现细节将会在后面的篇章介绍到。

2. 字符串基础

String
StringBuffer
StringBuilder

字符串String是用字符数组char[]实现的,但是因为该数组是个常量,所以也定义了Java字符串也是常量,一旦创建就不可以变更。因此催生出了第一个可变字符串工具类StringBuffer,它采用建造者模式,对append()insert()方法做synchronized关键字修饰,也就是做了同步互斥处理。但因为每次添加字符串都要检查锁,非常消耗性能,而且大部分该类的使用场景都是在方法内作为本地变量来调用,所以催生出了一个非线程安全版本的StringBuilder

3. 数据类型基础

Boolean
Byte
Double
Integer
Long
Number
Object
Enum
Void
Class
ClassLoader

这里说浅可以很浅,说深可以深入到C++源码的markOops对象头结构,还有双亲委派模型的类加载机制。小护士也会在后面专门讲解这块。

4. 其他基础

Cloneable
Comparable
Iterable
Math
  • Cloneable接口通常与浅拷贝和深拷贝有关系,而深拷贝则会与Java对象序列化反序列化技术直接相关,把这块讲清楚起码要独立写一篇博文才行,毕竟要深入到实现原理上。
  • Comparable接口是排序用的,代码虽然简单,但是设计很经典。
  • Iterable接口通常与Java集合包相关联,目的是为了提供一个迭代器对象,使用迭代器模式遍历数组元素。
  • Math类用于数学计算,平时更多是用它的random()方法,而这里又会涉及到util包的Random类实现细节。

lang包代码修行

lang包除了上面几个面试重点内容以外,还有其他几个类是小护士推荐在工作闲暇之余研究的:

CharSequence
Character
Compiler
Process
ProcessBuilder
Runtime
SecurityManager
System

这些都是偏向操作系统层面的类,需要花点时间去研究背后的C++代码怎么处理。

lang包的子包

  • annotation(注解相关)
  • instrument(Class定义相关)
  • invoke(对象调用相关)
  • management(JMX相关)
  • ref(对象引用方式相关,例如弱引用)
  • reflect(对象反射技术相关)

这些子包将会在后续博文中逐一介绍,其中,ref包和reflect包是面试重点内容。

学习交流

写到这里,第一篇《Java8源码阅读》就完成了,虽然只是对lang包做了简单的结构解析,但起码对java的核心包有了大概的了解,知道哪块是哪块,在脑海中形成一个清晰的学习路线图。

为了方便大家日后技术交流,小护士在这里特别推荐如下交流方式:

QQ群:JAVA高级交流(329019348)
QQ群:大宽宽的技术交流群(317060090)

如果有对博文内容有任何技术问题,欢迎评论留言或加群讨论,谢谢大家。

你可能感兴趣的:(青铜上分,Java源码)