如何高效的阅读最难的JDK源码?

java JDK官方中文版文档 完全中文文档,在搜索栏键入函数,随查随看。java jdk文档。分有所值。 立即下载

1. 前言

之前断断续续读过一部分 JDK 常用类的源码,这里想把过程中的一些心得和方法记录下来,如果能帮到需要的小伙伴就再好不过了!

本文主要分享一下我的阅读工具和阅读顺序。

PS: 由于当前主流使用的 JDK 版本仍是 1.8,因此源码阅读主要是 1.8 版本,有些地方可以参考 1.7(面试可能问到)。

2. 工具

工欲善其事,必先利其器。

需要的工具不多,IDE + Google 翻译足够了。

使用 IDE 的主要目的是可以写一些测试代码以便跟踪调试。这个还是很有必要的,跟进代码的执行流程更容易理解它的实现原理。

直接在 IDE 打开源码文件,源码中的注释通常很详细,遇到不懂的地方 Google 翻译一下。也可以加上官方文档,其实源码里面注释跟文档是一样的,有些地方可能更详细,只不过官方文档排版更漂亮一些。

JDK 1.8 官方文档链接:https://docs.oracle.com/javase/8/docs/api/

当然,阅读的先后顺序也很重要,下面介绍下我的阅读顺序。

3. 阅读顺序

3.1 整体顺序

JDK 中的代码非常多,不可能、也没必要全部读完,因此要有的放矢。从整体上来讲,顺序大概是:

  1. 集合框架类

    1. 主要包括 Collection、Map、Queue 等组成的一系列常用类和接口,包括 ArrayList、LinkedList、HashMap 等。

    2. 这部分内容日常开发使用较多,而且面试高频出现,因此可以先从这里入手。

  2. 并发包

    1. 即 java.util.concurrent (J.U.C) 包下的常用类,包括 ReentrantLock、ThreadPoolExecutor、AQS 等。

    2. 该部分提供了并发编程的常用工具类,也是面试高频。

  3. 其他常用类

    1. 例如 ThreadLocal、String、StringBuilder、StringBuffer 等。

整体概览如下:

具体到某一个类,如何去阅读它的源码实现呢?下面继续介绍。

3.2 具体顺序

3.2.1 类和接口

如何阅读一个类的源码呢?主要步骤大概是:

  1. 先读接口代码。包括接口说明文档、各个方法的定义和说明文档。

  2. 再去读实现类的主要方法实现,通常有以下两条主线入口:

    1. 构造方法

    2. 常用方法

在 Java 中,接口通常意味着是一种“标准”、或者“协议”。一个接口可以有多个实现类,它们都会按照接口的这种标准来实现接口的各个方法。因此,理解了一个方法的定义,再去看它的实现会更容易理解。

下面以常用的 ArrayList 为例,分析如何去阅读它的源码。

3.2.2 ArrayList 源码分析

首先看下 ArrayList 的继承结构:

可以看到它实现了很多接口,其中三个接口 Cloneable、RandomAccess、Serializable 都是空的,可以暂时忽略。主要去看 Iterable、Collection 以及 List 接口的方法定义。

Iterable 接口:

Collection 接口:

List 接口:

看起来方法挺多,其实不少都是我们平时会用到的,大部分理解起来并不困难,而且方法也都有注释。这部分难度不大。

接下来根据前面提到的两条主线入口,分析 ArrayList 的源码如何阅读。

  • 构造器

分析一个类的源码时,构造器通常是一个好的切入点。比如 ArrayList 的三个构造器如下:

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // replace with empty array.
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

构造器中有不少成员变量,比如 elementData、EMPTY_ELEMENTDATA、DEFAULTCAPACITY_EMPTY_ELEMENTDATA 等,继续跟进这几个变量:

private static final Object[] EMPTY_ELEMENTDATA = {};

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

transient Object[] elementData; // non-private to simplify nested class access

由此可以得知,当我们写了 new ArrayList() 时,它的内部到底做了些什么。

  • 常用方法

除了构造器,常用方法也是一个主要的入口,比如 add、remove 等。

add 方法实现:

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

可以一行行跟进代码,查看 add 方法内部到底做了什么。

其他方法的套路也是如此,不再一一说明。

按照这样一条条主线走下来,就可以对 ArrayList 的实现原理有个整体的认知了。整体部分搞清楚之后,接下来还可以去读一些不太常用的方法,包括剩余的所有部分。

PS: 这里只是以常用的 ArrayList 为例,其他包下的类的阅读步骤也大同小异。

3.3 做笔记

此外,做笔记也很重要。

可以用思维导图梳理整体脉络,用笔记工具记录一个类的核心部分实现原理。

当然,如果自己整理和写出来笔记更好,许多时候总觉得自己知道了,但是别人一问就懵了,可能还是没理解到位吧。

有句话说得好:”教是最好的学“。当你能把某个知识点通俗易懂的讲给一个外行人,才是真的懂了。

3.4 注意点

刚开始读时,可能会遇到某些地方难以理解,可以尝试写测试代码断点跟踪调试,或者参考别人的博客。

如果遇到某个点实在难以理解,也可以先跳过,过段时间再重新思考也许就豁然开朗了。

jdk1.8 源码中文版,jdk直接显示中文注释 下载后直接去本机jdk目录里替换jdk中的src.zip 再打开idea就能看到中文版的源码注释 示例 https://blog.youkuaiyun.com/a7459/article/details/106495622 立即下载

相关推荐

jdk 中文帮助文档

java中文开发文档 java程序员必备

JDK官方文档(包含所有版本)

JDK官方文档地址(所有版本):https://docs.oracle.com/javase/specs/index.html

青春年少不知疼的博客 1万+

SECS/GSM 测试工具 SecsExpress 的配置与实战应用

本文详细介绍了半导体设备通讯测试工具SecsExpress的配置与实战应用。作为专业的SECS/GSM协议调试工具,它能模拟Host与设备端进行双向测试,帮助工程师快速部署、验证通讯链路,并高效排查与RMS系统或真实设备间的联调问题,是提升半导体工厂设备集成与维护效率的利器。

yhn456789的博客 299

掌握Java JDK 1.8 API帮助文档中文版,事半功倍编程

JDK 1.8 API帮助文档是Java标准库的官方文档,其中包含了各种类、接口和方法的详细说明。它是Java开发者的必备工具,通过查阅API文档,您可以了解每个类和方法的功能、参数、返回值等信息,以及如何正确地使用它们。JDK 1.8 API帮助文档的中文版为中文开发者提供了更加便捷的学习和参考资料。JDK 1.8 API帮助文档中文版是Java开发者不可或缺的重要资源,它提供了详尽的类和方法说明,为我们在Java编程过程中提供了宝贵的帮助。

学IT,找陈寒 1万+

Arcmap计算土方量教程

1. 创建现状TIN 结果数据: 2. 创建设计TIN 结果数据: 注意:现状TIN和设计TIN构建时候的坐标系不同,设置坐标系见最后的注意事项第1点,就是import(导入)那步骤,现状TIN构建时选择高程点数据或者等高线数据,设计TIN构建时候选择洱海面数据 3. TIN转栅格 改成你要存的数据库,注意中间不要有汉字 结果数据(设计TIN转栅格的同理) 4. 裁剪现状TIN转成的栅格 结果数据: 5. 计算土方量 结果数据: ...

欢迎关注,共同进步! 5015

ESP32-CAM搭建Arduino及简单使用

配置环境 方法一 文件 → 首选项 http://wechat.doit.am/package_esp8266com_index.json https://dl.espressif.com/dl/package_esp32_index.json 工具 → 开发板 → 开发板管理器 等待安装 方法二 https://github.com/espressif/arduino-esp32 Arduino安装目录下,找到hardware文件夹 建立文件夹espressif,然后在里面再建立一个esp32文件夹

Ying的博客 2万+

如何更高效地阅读JDK源码

简介 阅读源码的几个问题: 为什么要看JDK源码 JDK源码的阅读顺序 JDK源码的阅读方法 为什么要看JDK源码 一,JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果。 二,JDK源码中包含大量的数据结构知识,是学习数据结构很好的资料,比如,链表、队列、散列表、红黑树、跳表、桶、堆、双端队列等。 三、JDK源码中包含大量的设...

每天叫醒自己的不是闹铃 是娟 是梦 是理想。 1370

使用LSTM进行多任务学习:共享模型预测多个目标

多任务学习是一种机器学习方法,旨在通过同时学习多个相关任务来提高模型的学习效率和泛化能力。MTL的核心思想是共享模型的参数,从而在不同任务之间捕捉到共享的特征。长短期记忆网络(LSTM)是循环神经网络(RNN)的一种改进版本,专门用于解决传统RNN在处理长序列时出现的梯度消失和梯度爆炸问题。LSTM通过引入多个门控机制(输入门、遗忘门和输出门)来控制信息的流动。本文详细探讨了如何使用LSTM进行多任务学习。我们介绍了多任务学习的理论基础、LSTM的特点,以及如何构建和训练一个多任务LSTM模型。

斌擎科技 1154

如何阅读JDK源码?

阅读源码初期会感到艰涩,但一旦突破某个临界点,你会发现自己对Java乃至编程的理解会产生质的飞跃。如果在阅读具体某个类时遇到难以理解的代码段,随时可以带着具体问题来探讨。阅读JDK源码是进阶为高级工程师的必经之路,它能帮你建立对技术深度的“手感”。、并发容器、线程池),不仅要读懂,还要能口述核心流程,并能在白板上画出数据结构演变图(如。每天花1小时,专注一个类的一个方法,搭配调试和画图。(IoC容器核心)的源码,看看它们如何应用这些JDK基础组件。,并提供一个从源码分析到动手实现的清晰路径。

futurn_hero的博客 894

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1761

AI驱动芯片设计的端到端验证:AI应用架构师的全流程指南

想象你要建造一座1000层的超级摩天大楼,每个房间都有独特的功能,管道、电路、电梯系统交织如迷宫。传统的检查方式是派1000个工程师逐层逐房手动检查,耗时十年且仍可能遗漏火灾隐患。这就是今天芯片设计面临的困境:7nm芯片含百亿晶体管,相当于百亿个"房间",传统验证方法(人工编写测试用例、随机仿真)已难以应对。本文的目的,是为AI应用架构师提供一份"AI驱动芯片验证导航图",范围涵盖从验证需求分析到芯片签核的全流程,包括AI模型如何融入传统验证工具链、数据如何驱动验证效率提升、以及端到端闭环系统的构建方法。

2501_92132293的博客 1242

关于JDK源码:我想聊聊如何更高效地阅读

简介 大家好,今天我想和大家再聊聊JDK源码的几个问题: 为什么要看JDK源码 JDK源码的阅读顺序 JDK源码的阅读方法 为什么要看JDK源码 一,JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果。 二,JDK源码中包含大量的数据结构知识,是学习数据结构很好的资料,比如,链表、队列、散列表、红黑树、跳表、桶、堆、双端队列等。 三、JDK源码中包含大量的设计模式,是学习设计模式很好的资料,比如,适配器模式、模板方法模式、装饰器模式、迭代

Java烂猪皮 8149

5分钟用AI搞定顶刊级引言!掌握三段式结构+避坑要点,让你的Introduction更有说服力(附提示词)

说明你是怎么来填补这个缺口的,一句话概括你的研究,再简述你采用了什么新方法、新模型或新视角,也就是创新点,最后说明你的方案是怎么克服第二段提到的缺口的,带来了哪些贡献,注意要确保方案与第二段提到的缺口一一对应。以上三段式引言模板,是非常经典的问题导向型结构,相比传统的结构,这种结构更能吸引是审稿人的注意,希望这篇分享的模板能给在你写论文引言时,提供一点帮助。上一段写好后,就在前人研究的基础上,亮出自己的方案,借助AI说明自己的研究,用了什么新方法/框架/理论/视角来填补这个缺口的。

智能AI让学术科研更容易 746

是时候该开始读一读JDK源码了

为什么要读JDK源码 当然不是为了装,毕竟谁没事找事虐自己 … 1、面试跑不掉。现在只要面试Java相关的岗位,肯定或多或少会会涉及JDK源码相关的问题。 2、弄懂原理才不慌。我们作为JDK的使用者,虽然说天天用得很开心,但是有时候遇到问题还是得跟到底层源码去看看,才能帮助我们更好的弄懂原理, 3、学习优秀的代码、思想和模式。JDK毕竟是一个优秀的代码库,我们天天用,源码也就在里面,作为一个...

CodeSheep 7964

【小白深度教程 1.8】手把手教你使用 Depth Anything V2 估计单目深度,并映射到 3D 点云(含 Python 代码)

我们尝试使用单目深度估计技术(Depth Anything V2),来进行准确的双目深度估计,并将场景转换成 3D 点云,Python 代码在最后。

2401_87064292的博客 5090

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

如何阅读jdk源码?

简介 这篇文章主要讲述jdk本身的源码该如何阅读,关于各种框架的源码阅读我们后面再一起探讨。 笔者认为阅读源码主要包括下面几个步骤。 设定目标 凡事皆有目的,阅读源码也是一样。 从大的方面来说,我们阅读源码的目的是为了提升自己的技术能力,运用到工作中,遇到问题快速定位,升职加薪等等。 从小的方面来说,阅读某一段源码的目的就是要搞清楚它的原理,就是死磕,就是那种探索真相的固执。 目的是抽象的,目标是...

whoisyourdaddy6的博客 1029

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java程序员如何高效阅读JDK源码?

前几日看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做过多的赘述了,我这篇主要跟大家说说怎么去看源码。

weixin_50205273的博客 719

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

高效阅读JDK源码,保姆级JDK源码笔记真香

作为一名java的开发者,需要对JDK源码有一定的了解和学习,同时也是个人能力的体现,也是在面试中给自己的加分项目。因此个人总结学习JDK源码的相关知识的方法和JDK源码服务图。JDK 中的代码非常多,作为是初学者需要阅读一下基本的源码,参考互联网上各种意见,个人认为阅读JDK源码需要具备一下几点:熟悉了解JDK的使用 熟悉openJDK的编译 了解常见软件设计模式一,JDK源码是其它所有源码的基础,看懂了JDK源码再看其它的源码会达到事半功倍的效果。二,JDK源码中包含大量的数据结构知识,是学习数据结构很

老男孩的架构路 1341

JDK 源码:阅读指引

阅读JDK源码对于深入理解Java语言的内部机制和提高编程水平非常有帮助。

qq_33240556的博客 833
上一篇: 初出校园,从Java小白到阿里P8架构师需要学习哪些技术?
下一篇: 开源|优酷动态模板研发体系为分发提效30%
JavaAOE
博客等级 码龄7年 27粉丝 49原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值