是時候該開始讀一讀JDK源碼了

image


爲何要讀JDK源碼

固然不是爲了裝,畢竟誰沒事找事虐本身 ...java

image

一、面試跑不掉。如今只要面試Java相關的崗位,確定或多或少會會涉及JDK源碼相關的問題。程序員

二、弄懂原理纔不慌。咱們做爲JDK的使用者,雖說每天用得很開心,可是有時候遇到問題仍是得跟到底層源碼去看看,才能幫助咱們更好的弄懂原理,面試

三、學習優秀的代碼、思想和模式。JDK畢竟是一個優秀的代碼庫,咱們每天用,源碼也就在裏面,做爲一個有志向的程序員,讀一讀源碼也能讓咱們吸收到更多優秀的思想和模式。編程

四、睡前催眠。額 …… 不過的確有效(滑稽)。設計模式


源碼難嗎?

廢話,固然有難度啦,否則我也不會到如今都還沒看完,並且看了也常常忘,哭唧唧...網絡

image

畢竟像JDK這種源碼,和咱們日常練手寫小例子、寫業務代碼不同,人家畢竟是 類庫,爲了性能穩定性通用性擴展性等因素考慮,加入了不少輔助代碼泛型、以及一些設計模式上的考量,因此看起來確定沒有那麼輕鬆,沒辦法一眼看穿它多線程

因此這玩意兒確定是一個長期的過程,我我的建議(包括我本身也是這樣),有時候遇到一些問題,能夠針對性地把某些組件或者某個部分的源碼,跟到底層去看看,而後作點筆記,寫點註釋啥的,這樣慢慢就能滲透到不少的內容了。併發

可是咱們必定要有足夠的信心,我堅信代碼人家都寫出來了,我就不信我看不懂!函數式編程


源碼該怎麼看

一、方法一:按需閱讀。若是對某個組件、語法或者特性感興趣,或者遇到什麼問題疑惑,能夠有針對性地跟到底層源碼按需查看,這也是一種比較高效,能快速樹立信心的閱讀方式。函數

二、方法二:系統化閱讀。具體閱讀內容和順序建議下文詳述。

三、多調試:若是僅僅靠眼睛看,而後腦補畫面調試仍是比較吃力的,最好仍是藉助IDE動手調試起來,走兩步就知道了。

四、別光讀,記得讀完留下點什麼。我以爲看了多少不重要,重要的是能輸出多少,多總結、概括,寫註釋,記筆記

因此下文準備搭建一個Java源碼的閱讀和調試環境,建議人手一個,每當 心血來潮時遇到問題時碰到疑惑時閒得無聊時均可以打開工程看一看源碼,作作筆記和註釋。

搭建源碼閱讀調試環境

我我的以爲看源碼這個事情仍是應該單獨搞一個Java工程,源碼放裏面,測試代碼也放裏面,集中調試集中看代碼集中寫註釋比較方便一些。

一、建立源碼閱讀項目

選擇最普通的Java基礎項目便可:

image

二、建立兩個目錄

分別爲:

  • source:稍後放置JDK源碼進去
  • test:放置測試代碼,裏面還能夠按須要創建層級子目錄

image

三、導入JDK源碼

有不少小夥伴問JDK的源碼在哪裏呢?

遠在天邊,僅在眼前,其實在的JDK安裝目錄下就能找到。

JDK安裝目錄下有一個名爲src.zip壓縮包,這正是JDK源碼!

image

將其解壓後拷貝到上面項目的source目錄下,這樣JDK源碼就導入好了。

image

有些小夥伴會有疑問,爲何要將JDK源碼導一份放到這個項目裏? 其實主要緣由仍是方便咱們在源碼裏閱讀、調試、以及作筆記和註釋。

至於這份JDK源碼怎麼用上,下文繼續闡述。

四、調試並運行

咱們能夠在test目錄裏去隨意編寫一段測試代碼。

好比我這裏就以HashMap爲例,在test目錄下建立一個子目錄hashmap,而後在裏面建立一個測試主入口文件Test.java,隨意放上一段測試代碼:

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 );

    for ( Map.Entry<String,Double> entry : hashMap.entrySet() ) {
        System.out.println( entry.getKey() +":" + entry.getValue());
    }

}

而後啓動調試便可。

不過接下來會有幾個問題須要一一去解決。

問題一:啓動調試時Build報錯,提示系統資源不足

image

解決方法: 加大Build process heap size

設置方法:Preferences --> Build,Execution,Deployment --> Compiler,將默認700的數值加大,好比我這裏設置爲1700

image

問題二:想從外層代碼F7單步調試進入JDK源碼內部,結果發現進不去

這是由於調試時,JDK源碼受保護,通常單步調試不讓進,可是能夠設置。

解決方法:

Preferences --> Build,Execution,Deployment --> Debugger --> Stepping

image

問題三:如何對JDK源碼作註釋?

調試進入JDK源碼之後,發現不能進行註釋,每一個文件上都有一個小鎖的圖標,這是由於如今關聯的源碼並非咱們項目裏剛拷進去的源碼,而是JDK安裝目錄下的src.zip只讀壓縮包。

解決辦法: 從新關聯JDK源碼路徑爲本項目路徑下的這一份JDK源碼。

image

這樣一來,咱們就能夠愉快地對JDK源碼調試以及作註釋了。


源碼結構和閱讀順序

JDK源碼畢竟太龐大了,全部都看不太現實,咱們仍是願意根據平常使用和麪試考察的頻繁度來挖取重要的內容先看一看。

若是本身沒有特別的規劃,能夠按照以下所示的建議閱讀順序往下進行:

image

具體的內容簡介以下:

一、java.lang

這裏面其實就是Java的基本語法,好比各類基本包裝類型(IntegerLongDouble等)、基本類(ObjectClassEnumExceptionThread)等等...

二、java.lang.annotation

包含Java註解基本元素相關的源碼

三、java.lang.reflect

包含Java反射基本元素相關的代碼

四、java.util

這裏面放的都是Java的基本工具,最典型和經常使用的就是各類容器和集合(ListMapSet

五、java.util.concurrent

大名鼎鼎的JUC包,裏面包含了Java併發和多線程編程相關的代碼

六、java.util.function +java.util.stream

包含Java函數式編程的常見接口和代碼

七、java.io

包含Java傳統I/O相關的源碼,主要是面向字節和流的I/O

八、java.nio

包含Java非阻塞I/O相關的源碼,主要是面向緩衝、通道以及選擇器的I/O

九、java.time

包含Java新日期和期間相關的代碼,最典型的當屬LocalDateTimeDateTimeFormatter

十、java.math

主要包含一些高精度運算的支持數據類

十一、java.net

主要包含Java網絡通訊(典型的如:Socket通訊)相關的源代碼。


共勉

看源碼這東西不能急,慢一點才能更快!共勉。

相關文章
相關標籤/搜索