Java Collections API原始碼分析
侯捷老師剖析了不少Framework,如MFC,STL等。侯老師有句名言:
原始碼面前,了無祕密
這句話還在知乎引起廣泛討論。
我對教授程式設計的一點想法是:
同學們開始不會程式設計,最好的學習方式是讀教材,敲程式碼,我還專門寫了一篇部落格指導同學們敲程式碼:《積極主動敲程式碼,使用Junit學習Java程式設計》,我認為閱讀經典圖書,積極主動敲5000行左右的程式碼,應該能解決語言基本語法的問題,基本程式設計的問題,基本工具(git,jdb,junit,idea...)的使用問題
然後同學們應該獨立編寫5000行左右的程式碼,解決程式邏輯錯誤的除錯,模組分解,資料結構與選用,問題解決的一般過程等相關問題
有了10000行程式碼的基礎,後面的學習提高要依靠程式碼閱讀了,比如JUnit的原始碼,JHotdraw的原始碼,Java Collection API的原始碼,Java JCE的原始碼等
教學中也是想通過這三個步驟進行訓練。
我們這學期主要講資料結構,希望同學們在學習時能分析一下Java Collection的原始碼。
我開玩笑地對朋友說,這本書出版,給大學課程中的“資料結構”和“演算法”兩門授課老師出了個難題。幾乎所有可能的作業題目(複雜度證明題除外),本書都有了詳盡的解答。然而,如果學生能夠從龐大的 SGI STL 原始碼中乾淨抽出某一部份,加上自己的包裝,做為呈堂作業,也足以證明你有資格獲得學分和高分。事實上,追蹤一流作品並於其中吸取養份,遠比自己關起門來寫個三流作品,價值高得多 — 我的確認為99.99 % 的程式設計師所寫的程式,在 SGI STL 面前都是三流水準。
我相信絕大多數程式設計師用Java實現的資料結構和演算法,相當於Java Collection API也是三流水準,希望同學們通過程式碼分析學習一流程式碼的實現方法,技巧等。
原始碼之前了無祕密,你將看到vector的實現、list的實現、heap的實現、deque的實現、RB-tree的實現、hash-table的實現、set/map 的實現;你將看到各種演算法(排序、搜尋、排列組合、資料移動與複製…)的實現;你甚至將看到底層的memory pool 和高階抽象的traits 機制的實現。那些資料結構、那些演算法、那些重要觀念、那些程式設計實務中最重要最根本的珍寶,那些蜇伏已久彷佛已經還給老師的記憶,將重新在你的腦中閃閃發光。
我希望同學們在分析Java Collection API原始碼時有相同的收穫。
程式碼閱讀和分析同學們可以重點參考一下侯捷老師的上窮碧落下黃泉-原始碼追蹤經驗談,文章要點是:
- 不要"一切從輪子造起",參考相關圖書,部落格
- 用好工具:我們推薦IDEA和SourceInsight
- 要做筆記
- 需要的基礎自己要打牢
大家也可以參考:
原始碼下載
安裝JDK時,選中“原始碼":
安裝完就會出一個src.zip
的檔案,解壓了就包含Java Collections API的原始碼:
這些程式碼在java.util
包中:
總覽
ArrayList
參考資料
- 如何閱讀別人的程式碼?
- 如何閱讀程式原始碼?
- 如何看懂原始碼--(分析原始碼方法)
- 如何通過閱讀別人的程式碼提高自己的程式設計能力
- Java Collections Framework - Java集合框架之概要
- Java集合框架之Collection例項解析
- ArrayList原始碼分析(基於JDK1.6)
版權宣告:自由轉載-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你覺得本文對你有幫助,請點一下左下角的“好文要頂”和“收藏該文”