1. 基础设置
① 使用创建新的工程 JavaSourceLearn
专门用于源码学习,基础设置就好。
② 建立 source
和 test
两个包,前者用于放JDK源码,后者用于测试入口。
③ 通过在终端 echo $JAVA_HOME
或IDEA内的 Project Structure-SDK
找到JDK的位置,解压源码 src.zip
。
④ 在IDEA source
包右键 reveal in finder
,并将解压后的源码导入。
⑤ 在 test.hashmap
下建一个测试类,写一个简单的 HashMap
测试,打断点并调试:
package cn.agoclover.test.hashmap;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, Double> hashMap = new HashMap<>();
hashMap.put("K1", 0.1);
hashMap.put("K2", 0.2);
hashMap.put("K3", 0.3);
hashMap.put("K4", 0.4);
}
}
⑥ 会发现资源不足,在 preference-Build-Compiler-Build process heap size
调为1700,重新调试即可编译成功。
⑦ 此时 F7-单步-Step into
发现无法进入底层源码,这是因为JDK源码是受保护的,一般的单步调试是不允许进源码的。Preference-Build-Debugger-Stepping
内取消勾选 Do not step into the classes
。
⑧ 重新调试,按 F7
即可进入 HashMap
的源码。
⑨ 但此时在源码调试中,不可以注释,源码加锁,尝试右下角解锁也解不了,使用的是 $JAVA_HOME
处的 src.zip
安装包。Projects structure-SDK-Source path
,去掉 src.zip
,添加此项目下的源码。关闭 Test.java
以外的文件,再重新调试,进入源码,此时 HashMap.java
则不再有锁,且关联的就是当前项目下的源码:
2. 需要了解的源码
JDK 中包有哪些:
- java.lang : 包含一些Java语言的核心类, 如 String, Math, Integer, System 和 Thread, 提供常用功能.
- java.net : 包含执行与网络相关的操作的类和接口.
- java.io : 包含能提供多种输入/输出功能的类.
- java.util : 包含一些实用工具类, 如定义系统特性, 接口的集合框架类使用与日期日历相关的函数.
- java.text : 包含了一些java格式化相关的类.
- java.sql : 包含了java进行JDBC数据库编程的相关类/接口.
- java.awt : 包含了构成抽象窗口工具集(abstract window toolkits)的多个类, 这些类被用来构建和管理应用程序的图形用户界面(GUI).
- java.applet : 包含applet运行所需的一些类.
以下为java基础但很重要的包或类,会不断修改和补充:
|-java
|-lang 基础语法和包装类型
| |-reflect java的反射机制
| |-annotation
| |-Character 字符串
| |-Long 包装类
| |-Class 基础的类
| |-Enum 枚举
| |-Exception 异常定义
|
|-util 基础的工具
| |-ArrayList
| |-HashMap
| |-HashSet
| |-concurrent JUC,多线程与并发
| | |-atomic 原子类
| | |-locks 锁的实现
| | | |-ReadWriteLock
| | |
| | |-Callable 基础语法
| | |-Executor
| | |-ConcurrentMap 多线程基础的线程安全的集合
| | |-CopyOnWriteArrayList
| | |-CopyOnWriteArrayList
| | |-BlockingDeque 并发
| | |-BlockingQueue 并发
| |
| |-function 函数式编程的接口
| |-stream 与函数式编程相关的流式操作的实现
|
|-io 面向字节(流)的io,即普通io/阻塞式io
|-nio 非阻塞io,buffer缓冲类,通道类,选择器,难度高
|-math 大数以及基本的数学
|-time 日期和时间,尤其是JDK1.8新增的日期和时间类
| |-LocalDate
| |-LocalDateTime
| |-LocalTime
|
|-net 网络通信