你好,我是楊曉峰。今天這期周末福利,我整理了幾本自己在學習和使用 Java 時用過的參考書,把它們分享與你。在專欄里,有不少同學留言讓我推薦一些參考書。另外,我認為,書是個好的系統化知識來源,但更多提高還是來源于實踐、閱讀源碼、技術交流等,畢竟書籍也很難完全跟上技術和架構的變革,另外我也盡量縮減了書單的長度。
關于夯實 Java 編程基礎,我推薦 **Bruce Eckel 的《Java 編程思想》**(Thinking in Java),非常有名的經典書籍。這本書的特點是,不僅僅介紹 Java 編程的基礎知識點,也會思考編程中的各種選擇與判斷,包括穿插設計模式的使用,作者從理論到實踐意義從不同的角度進行探討,構建穩固的 Java 編程知識體系。
當然這本書也有不足之處,畢竟每個人的基礎不太一樣,如果你完全沒有 Java 編程基礎,也可以考慮其他的參考書,例如 **《Java 核心技術》**。
另外,這兩本書的部分內容已經多少有點過時了,尤其是《Java 編程思想》。例如,目前很少會需要學習 Java 桌面圖形類庫等,較新的語法和 API 當然也沒有包含,我的建議是盡管忽略過時內容,適當補充 Java 新技術的學習。
提到經典,自然也少不了 **《Effective Java》**,這本書的英文第三版已經在國內上市,涵蓋了 Java 7 到 Java 9 的各種新特性。嚴格來說,這本書不算是一本基礎書籍,但當你有一定基礎后,還是非常建議通讀一下的。關于這本書的閱讀,我的建議是邊學習邊回顧,在吸收書中的經驗時,多去想想自己在實際應用中是如何處理的。雖然《Effective Java》的具體章節可能是從某個點出發,但可以說都是對 Java、JVM、面向對象等各種知識的綜合運用,對于設計和實現高質量的代碼很有幫助。
?
**《Head First 設計模式》** 這本書就不用我再費筆墨去介紹了吧,能把設計模式用這種輕松的形式展現本身已經十分不易了,章節之間的聯系讓你可以反復加深印象,加上生動的表達方式和豐富的習題更容易沉浸其中。
??
這本書非常適合對面向對象和設計模式基礎有限的同學。設計模式不是銀彈,實踐中也莫要為了模式而模式,掌握典型模式,能夠舉一反三就很好了,就當作是程序員之間溝通的“方言”。
談過了 Java 基礎,接下來聊聊**并發和虛擬機**的參考書。
**《Java 并發編程實戰》**,作者全是響當當的人物,比如 Brian Goetz,我多次在專欄里引用他的觀點,眾多強力作者也保證了書的質量。拋開作者光環,這本書的內容全部建立在理論之上,先講清道理再談實踐,可以真正讓你知其然也知其所以然。這本書更加側重并發編程中有哪些問題,如何來深刻地理解和定義問題,如何利用可靠的手段指導工程實踐,并沒有過分糾結于并發類庫的源碼層面。
?
這本書的我的學習建議是,盡量充分利用其中提供的樣例代碼,結合自己的業務實踐去深入學習,畢竟這本書的內容有些偏理論,可能并不適合你快速掌握所謂并發“核心”技術。
?
關于 JVM 的學習,不用我多說了吧,看過專欄的同學肯定都知道,我經常推薦**周志明的《深入理解 Java 虛擬機》**,可以說是國內最好的 JVM 書籍之一。
?
我這里并沒有單獨推薦類似 GC 算法等書籍,它們對于大多數 Java 工程師的價值也許有限。
關于性能優化,我推薦**Charlie Hunt 和 Binu John 所著的《Java 性能優化權威指南》(Java Performance)**,也是我上次在直播時向大家推薦的。Java 之父 James Gosling,也力薦這本參考書。
?
但這本書也存在著不足,里面過于偏重 Solaris 等商業操作系統和相關工具,我建議你在閱讀的時候,盡量體會其思路和原理,更加側重于 Linux 等主流開放平臺。
還有一些如開源軟件和互聯網架構相關的圖書可以作為擴展閱讀,你可以參考下面這幾本。
* [ ] 《Spring 實戰》
可以說 Spring 等相關框架已經成為業務開發的事實標準,系統性地掌握 Spring 框架的設計和實踐,是必需的技能之一。
* [ ] 《Netty 實戰》
Netty 在性能、可擴展性等方面的突出表現,已經得到充分驗證,作為基礎的通信框架,已經廣泛應用在各種互聯網架構、游戲等領域,甚至可以說,如果沒有仔細分析過 Netty,對 NIO 等方面的理解很可能還在很膚淺的階段。
* [ ] 《Cloud Native Java》
Java 應用程序架構處于飛快的演進之中,微服務等新的架構應用越來越廣泛,即使未必是使用 Spring Boot、Spring Cloud 等框架,但是系統的學習其設計思想和實踐技術,絕對是有必要的。當然如果你在實踐中使用 Dubbo 等框架,也可以選擇相關書籍。
前沿領域的變化非常快,很多風靡一時的開源軟件,在實踐中逐漸被證明存在各種弊端,或者廠商停止維護。所以這部分的學習,我建議不要盲目追新,最好是關注于分布式設計中的問題和解決的思路,做到觸類旁通,并且注重書籍之外的學習渠道。
下面兩本并不算是 Java 書籍,但 Java 程序員進階少不了對互聯網主流架構的學習,了解分布式架構、緩存、消息中間件等令人眼花繚亂的技術,對于有志于成為架構師的 Java 工程師來說非常有幫助。
* [ ] 《大型分布式網站架構設計與實踐》
這本書總結了作者在構建安全、可穩定性、高擴展性、高并發的分布式網站方面的心得。
* [ ] 《深入分布式緩存:從原理到實踐》
這本書融合了原理、架構和一線互聯網公司的案例實踐,值得參考。
- 前言
- 開篇詞
- 開篇詞 -以面試題為切入點,有效提升你的Java內功
- 模塊一 Java基礎
- 第1講 談談你對Java平臺的理解?
- 第2講 Exception和Error有什么區別?
- 第3講 談談final、finally、 finalize有什么不同?
- 第4講 強引用、軟引用、弱引用、幻象引用有什么區別?
- 第5講 String、StringBuffer、StringBuilder有什么區別?
- 第6講 動態代理是基于什么原理?
- 第7講 int和Integer有什么區別?
- 第8講 對比Vector、ArrayList、LinkedList有何區別?
- 第9講 對比Hashtable、HashMap、TreeMap有什么不同?
- 第10講 如何保證集合是線程安全的? ConcurrentHashMap如何實現高效地線程安全?
- 第11講 Java提供了哪些IO方式? NIO如何實現多路復用?
- 第12講 Java有幾種文件拷貝方式?哪一種最高效?
- 第13講 談談接口和抽象類有什么區別?
- 第14講 談談你知道的設計模式?
- 模塊二 Java進階
- 第15講 synchronized和ReentrantLock有什么區別呢?
- 第16講 synchronized底層如何實現?什么是鎖的升級、降級?
- 第17講 一個線程兩次調用start()方法會出現什么情況?
- 第18講 什么情況下Java程序會產生死鎖?如何定位、修復?
- 第19講 Java并發包提供了哪些并發工具類?
- 第20講 并發包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么區別?
- 第21講 Java并發類庫提供的線程池有哪幾種? 分別有什么特點?
- 第22講 AtomicInteger底層實現原理是什么?如何在自己的產品代碼中應用CAS操作?
- 第23講 請介紹類加載過程,什么是雙親委派模型?
- 第24講 有哪些方法可以在運行時動態生成一個Java類?
- 第25講 談談JVM內存區域的劃分,哪些區域可能發生OutOfMemoryError?
- 第26講 如何監控和診斷JVM堆內和堆外內存使用?
- 第27講 Java常見的垃圾收集器有哪些?
- 第28講 談談你的GC調優思路?
- 第29講 Java內存模型中的happen-before是什么?
- 第30講 Java程序運行在Docker等容器環境有哪些新問題?
- 模塊三 Java安全基礎
- 第31講 你了解Java應用開發中的注入攻擊嗎?
- 第32講 如何寫出安全的Java代碼?
- 模塊四 Java性能基礎
- 第33講 后臺服務出現明顯“變慢”,談談你的診斷思路?
- 第34講 有人說“Lambda能讓Java程序慢30倍”,你怎么看?
- 第35講 JVM優化Java代碼時都做了什么?
- 模塊五 Java應用開發擴展
- 第36講 談談MySQL支持的事務隔離級別,以及悲觀鎖和樂觀鎖的原理和應用場景?
- 第37講 談談Spring Bean的生命周期和作用域?
- 第38講 對比Java標準NIO類庫,你知道Netty是如何實現更高性能的嗎?
- 第39講 談談常用的分布式ID的設計方案?Snowflake是否受冬令時切換影響?
- 周末福利
- 周末福利 談談我對Java學習和面試的看法
- 周末福利 一份Java工程師必讀書單
- 結束語
- 結束語 技術沒有終點
- 結課測試 Java核心技術的這些知識,你真的掌握了嗎?