壓箱底 | Java 編程學(xué)習(xí)必讀的十本書(shū)
小伙伴們大家好呀!
今天給大家嘮一嘮 Java 學(xué)習(xí),經(jīng)常有小伙伴留言問(wèn)我:『Java怎么學(xué)習(xí)啊?我好迷茫啊,快救救我!』
其實(shí)這個(gè)話題有點(diǎn)大了,每個(gè)人現(xiàn)階段水平不一樣,比如說(shuō)對(duì)Java 虛擬機(jī)的理解:
初級(jí)程序員可能一臉懵:『我學(xué)這個(gè)干什么?這不都封裝好了嗎?』
中級(jí)程序員內(nèi)心竊喜:『這不就是 java 面試八股文經(jīng)常考察的東西嗎?我門(mén)兒清』
高級(jí)程序員輕蔑一笑:『我之前動(dòng)手實(shí)現(xiàn)過(guò)虛擬機(jī)』
這說(shuō)明同樣一種技術(shù)不同的人認(rèn)知水平是不一樣。
對(duì)于 Java 學(xué)習(xí)也是一樣的,有些人喜歡看視頻學(xué)習(xí),覺(jué)得視頻有趣,跟著老師一步一步敲代碼;
但有些人就會(huì)覺(jué)得看視頻學(xué)習(xí)沒(méi)意思,老師講的太繁瑣了,太拖沓了,還是自己看書(shū)更帶勁。
我在這里講講自己的看法,對(duì)于入門(mén)初級(jí)程序員,看視頻跟著老師的思維一步步走,確實(shí)能培養(yǎng)編程興趣。記得幾年前我初學(xué) Java 時(shí)在網(wǎng)上看了很多馬士兵老師的視頻,當(dāng)時(shí)覺(jué)得這個(gè)老師不光技術(shù)好,人也超級(jí)幽默,編程的興趣一下子提了上來(lái),直到今天還在 IT 行業(yè)混,哈哈!
但是視頻看多了你會(huì)發(fā)現(xiàn):聽(tīng)著都懂,關(guān)掉視頻自己寫(xiě)啥也不會(huì)啊。這最大的原因其實(shí)就是因?yàn)樽约簺](méi)有獨(dú)立思考。
所以建議大家入門(mén)了之后還是不要過(guò)于依賴視頻,要學(xué)會(huì)獨(dú)立思考,看書(shū)是個(gè)不錯(cuò)的方法。
關(guān)于 IT 行業(yè)到底要不要看書(shū),這個(gè)我之前可是踩過(guò)坑的,一些「大佬」跟我說(shuō):IT 行業(yè)日新月異,一本書(shū)的出版一般都是要耗費(fèi)幾年時(shí)間,等書(shū)出出來(lái)了,技術(shù)都過(guò)時(shí)了。我當(dāng)時(shí)覺(jué)得:我屮艸芔茻,有道理啊。正是因?yàn)檫@種思想,為我日后不愛(ài)學(xué)習(xí)埋下了禍根。
其實(shí)現(xiàn)在回過(guò)頭來(lái)看,這個(gè)說(shuō)法不完全正確,對(duì)于一些垃圾書(shū)確實(shí)是這樣的,但是對(duì)于那些經(jīng)典之作,時(shí)間的流逝也不能掩蓋住它的經(jīng)典。比如說(shuō)《深入理解 java 虛擬機(jī)》這本書(shū)最早是在 2011年出版,快 10 年有人說(shuō)它過(guò)時(shí)了嗎?現(xiàn)在應(yīng)屆生找工作前是不是都得背一背??磿?shū)還是得看經(jīng)典之作啊。
好了,開(kāi)始我們今天的主題,今天是想給學(xué)習(xí) Java 的程序員推薦一些經(jīng)典書(shū)籍,這些書(shū)籍覆蓋了初級(jí)、中級(jí)、高級(jí)程序員,總有一些適合你。另外需要說(shuō)明的是,本次推薦的書(shū)單僅僅只覆蓋 Java SE 部分,像 Java Web, 服務(wù)端開(kāi)發(fā),Spring框架全家桶,分布式微服務(wù),中間件,數(shù)據(jù)庫(kù)這些本次都不包括,留著后面慢慢推薦。

基礎(chǔ)學(xué)習(xí)
Java 語(yǔ)言基礎(chǔ)這塊要學(xué)的東西很多,像:
面向過(guò)程 VS 面向?qū)ο?/p>
面向?qū)ο蠡咎卣鳎悍庋b、繼承、多態(tài)
訪問(wèn)控制符:private、default、protected、public
數(shù)據(jù)類型:基本類型、引用類型
控制流程:for、while、switch 等
序列化
異常處理
泛型
……
下面十本書(shū)看完保證你的 Java 技術(shù)能上一個(gè)檔次:
《Java 核心技術(shù)卷I:基礎(chǔ)知識(shí)》
這本書(shū)建議作為Java 之旅的第一本書(shū),涵蓋的內(nèi)容非常全,比起那些30天學(xué)會(huì) Java 之類的書(shū),這邊書(shū)更加務(wù)實(shí)。
隨著技術(shù)的演講,書(shū)中有些技術(shù)已經(jīng)被時(shí)代拋棄,這部分的章節(jié)其實(shí)不用看。
像第十、十一、十二章:圖形程序設(shè)計(jì),主要講解 Swing GUI,用 Java 寫(xiě)桌面端應(yīng)用已經(jīng)過(guò)時(shí)了。有人會(huì)說(shuō)安卓,這是另外一套東西,不是 Swing。
第十三章主要講 Java 程序的部署,這里面的 applet 技術(shù)已經(jīng)淘汰了,再學(xué)就是浪費(fèi)時(shí)間。
大家要把有限的時(shí)間和精力花在更有價(jià)值的事情上。
《Java 核心技術(shù)卷II:高級(jí)特性》
卷II是卷I的加強(qiáng)版,針對(duì) Java 的一些高級(jí)特性如:java8、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、安全等進(jìn)行了詳細(xì)講解。
關(guān)于網(wǎng)絡(luò)那一章節(jié)大家可以簡(jiǎn)單看一下即可,因?yàn)樵谄髽I(yè)網(wǎng)絡(luò)編程開(kāi)發(fā)中多數(shù)會(huì)用到 netty 框架,這是一款性能好到炸的框架,建議大家后面好好學(xué)習(xí)下。
數(shù)據(jù)庫(kù)編程那一章節(jié)也可以簡(jiǎn)單看看,JDBC 操作數(shù)據(jù)庫(kù)實(shí)在是太麻煩了,編寫(xiě)程序有一堆樣板代碼,繁瑣程度令人發(fā)指,為了解決這個(gè)問(wèn)題出現(xiàn)了一系列有優(yōu)秀的 ORM 框架如:Hibernate、MyBatis 等。
最后與卷I一樣,Swing 這一章節(jié)也可以直接跳過(guò)了,具體原因上面已經(jīng)講過(guò)了,不啰嗦了。
《Java 實(shí)戰(zhàn)(Java8 實(shí)戰(zhàn))》
2021 年 9 月 14 號(hào) Oracle 正式發(fā)布了 Java17,有些小伙伴不禁要問(wèn)了,17 都出來(lái)了,現(xiàn)在還學(xué) Java8 是不是太多時(shí)了,不不不,據(jù)小帥了解現(xiàn)在很多公司都還停留在 Java8。
為什么大家都當(dāng)釘子戶呢?
這一方面說(shuō)明 Java8確實(shí)是很牛逼啊,Java8 是繼 Java5 之后改動(dòng)很大的一個(gè)版本,增加了 Stream 流等很多好用的特性;
另一方面,切換一個(gè) Java 版本費(fèi)時(shí)費(fèi)力,收益也不明顯,公司肯定不愿意動(dòng)了。
ok,我們?cè)僬f(shuō)回這本書(shū),《Java 實(shí)戰(zhàn)》是《Java8 實(shí)戰(zhàn)》的新版本,不光有 Java8 的新特性還有 Java9、Java10 等,如果你的公司目前只會(huì)用到 Java8,那么你直接看《Java8 實(shí)戰(zhàn)》也未嘗不可。
《Java8實(shí)戰(zhàn)》不會(huì)講解一些基礎(chǔ)的 Java語(yǔ)言,這本書(shū)的重點(diǎn)是講解 Java8 新特性和語(yǔ)法糖,讓你的 Java 代碼寫(xiě)起來(lái)更爽、更優(yōu)雅。
《Java編程思想(thinking in java)》
這是一本非常非常經(jīng)典的書(shū),你要問(wèn)搞 Java 的人如果沒(méi)聽(tīng)過(guò)這本書(shū)那算是白學(xué)了,哈哈。
其實(shí)說(shuō)實(shí)話這本書(shū)我試圖看過(guò)幾次,最終都沒(méi)有看完,一個(gè)原因是它太厚了,另外我覺(jué)得講得太啰嗦了,可能是因?yàn)榉g的不太好,所以我現(xiàn)在拿來(lái)墊桌子,高度合適挺好的。
所以呢,建議新人不要一開(kāi)始看這邊書(shū),不然你會(huì)懷疑人生,還沒(méi)入門(mén)就放棄了,就把它當(dāng)做編程字典,等你后面遇到問(wèn)題了拿起來(lái)再翻翻吧。
進(jìn)階學(xué)習(xí)
《深入理解Java虛擬機(jī)》
終于到這本書(shū)了,先允許我說(shuō)三聲牛逼:牛逼!牛逼!牛逼!
《深入理解Java虛擬機(jī)》這本書(shū)其實(shí) 2011 年就出版了,出版后其實(shí)是不溫不火的,那為什么后面就火了呢?
除了書(shū)寫(xiě)的好之外,最重要的一個(gè)原因還是國(guó)內(nèi) IT 行業(yè)太卷了,太卷了,太卷了!
卷到什么程度呢?我以面試題為例:
前幾年Java 程序員面試,面試官喜歡問(wèn):「HashMap 和 HashTable 哪個(gè)是線程安全的?」候選者能答出來(lái)并能說(shuō)幾個(gè)原因就已經(jīng)足夠了。
后來(lái)不行了啊,兄弟們,大家都背熟了,面試官只能升級(jí)了:「你看過(guò)HashMap的源碼嗎?是線程安全的嗎?」
候選者:「我看過(guò)源碼,HashMap 的方法上都沒(méi)有加 Synchronized 關(guān)鍵字,HashMap 1.8 版本還加入了紅黑樹(shù)」
再過(guò)幾年,程序員又進(jìn)化了,面試官只能加碼了:「HashMap 看過(guò)源碼嗎?請(qǐng)?jiān)诩埳蠈?xiě)一下紅黑樹(shù)的實(shí)現(xiàn)」
候選者頓時(shí)懵逼了,一口老血結(jié)束了本次面試……
Java 虛擬機(jī)也是一樣的,前些年研究這個(gè)的是一小撮人,后來(lái)由于行業(yè)太卷,為了更好地區(qū)分面試者,就慢慢開(kāi)始問(wèn)虛擬機(jī)相關(guān)的知識(shí)了。
以前你要說(shuō)你懂點(diǎn) java 虛擬機(jī)可能加分項(xiàng),時(shí)至今日這個(gè)只能算基本能力了。
好了,我們說(shuō)回這本書(shū),周志明大神寫(xiě)的,非常非常經(jīng)典,已經(jīng)更新到第三版了。周志明大神寫(xiě)書(shū)用詞非常嚴(yán)謹(jǐn),專業(yè)術(shù)語(yǔ)非常多,第一次讀的小伙伴可能有點(diǎn)懵,但是不要緊,多看幾遍,我自己也是看了很多遍,每次看完都有新的收獲,墻裂建議大家看完。
《Java并發(fā)編程的藝術(shù)》
在寫(xiě)代碼的時(shí)候大家伙有沒(méi)有碰到這樣的場(chǎng)景:我在本地測(cè)試好好的,怎么線上就出問(wèn)題了呢?
排除本地環(huán)境和生成環(huán)境不一致的問(wèn)題,其實(shí)最大的可能就是并發(fā)問(wèn)題了。
本地是你一個(gè)人在測(cè)試,但是到了生產(chǎn)環(huán)境,大量的用戶點(diǎn)擊,大量的請(qǐng)求涌進(jìn)來(lái),你的程序在并發(fā)訪問(wèn)的時(shí)候會(huì)不會(huì)出問(wèn)題呢?
并發(fā)問(wèn)題一般都比較難定位,寫(xiě)好并發(fā)編程尤為關(guān)鍵。
我們說(shuō)回《Java并發(fā)編程的藝術(shù)》這本書(shū),這是一本專門(mén)講解Java并發(fā)的書(shū),涉及到各種鎖、常見(jiàn)安全的集合類,基本就是將 JUC(java.util.concurrent包的簡(jiǎn)稱)里所有的內(nèi)容覆蓋了一遍,看完你一定有收獲。強(qiáng)烈推薦!
JUC 是 Java 大神 Doug Lea 開(kāi)發(fā)的一套類庫(kù),大神開(kāi)發(fā)這套代碼就是為了幫助大家簡(jiǎn)化并發(fā)編程,現(xiàn)在國(guó)內(nèi)有一大批人在研究他的代碼,他老人家應(yīng)該高興呢還是悲哀,哎~
寫(xiě)「好代碼」
學(xué)習(xí)Java,最終還是要付出實(shí)踐的,作為碼農(nóng)我們的成果就是一行行代碼。
相信大家都有接手過(guò)前輩們寫(xiě)的代碼,看到那些代碼,不禁冒出一句:這尼瑪哪個(gè)沙比寫(xiě)的,whats up!
這些代碼被稱之為「屎山」,我相信它們?cè)臼呛玫模皇请S著需求變更和新增,一步步腐爛了而已。
如果你不想給后人留下「屎山」,那么從現(xiàn)在開(kāi)始你就要學(xué)會(huì)寫(xiě)「好代碼了」,以免被同事打,哈哈~
下面推薦幾本有助于你寫(xiě)「好代碼」的書(shū)籍。
《阿里巴巴Java開(kāi)發(fā)手冊(cè)》
這本書(shū)是大廠阿里巴巴出品的,它的愿景是碼出高效,碼出質(zhì)量。作者將自己多年的開(kāi)發(fā)經(jīng)驗(yàn)和架構(gòu)歷程濃縮成為立體的編程規(guī)范和最佳實(shí)踐。
書(shū)的主要內(nèi)容是將 Java 編碼規(guī)范,編碼習(xí)慣非常重要,從一開(kāi)始就要養(yǎng)好。
如果你現(xiàn)在在一個(gè)小廠,你們組內(nèi)沒(méi)有任何編程規(guī)范,那么我建議你向你們的技術(shù)經(jīng)理推薦這本書(shū),說(shuō)不定能獲得升職加薪的機(jī)會(huì),試試唄,后面如果真有人這么干了,記得回頭在公屏上打出來(lái)。
組內(nèi)保持一致的編碼風(fēng)格,有助于大家快速理解代碼,減少撕逼~
《Effective Java中文版》
網(wǎng)上流傳程序員分為兩種,一種是讀過(guò)《Effective Java》的,一種是沒(méi)讀過(guò)的,可見(jiàn)大家對(duì)這本書(shū)的評(píng)價(jià)非常高。
Effective 系列非常經(jīng)典,覆蓋了很多語(yǔ)言:Effective Java、 Effective C、Effective C# 等,Effective Java 只是一個(gè)小小的分支。
這本書(shū)的知識(shí)密度很大,作者根據(jù)自己多年的編程經(jīng)驗(yàn)總結(jié)了很多條 best practice,每一條都是前人踩過(guò)的坑、流過(guò)的淚。
建議等你寫(xiě)了一定量代碼之后再看,不然你沒(méi)感覺(jué)。
《代碼整潔之道(Clean Code)》
代碼整潔之道,這本書(shū)的英文名是 clean code。
閱讀這本書(shū)有兩種原因:
第一,你是個(gè)程序員;
第二,你想成為更好的程序員。
如果你對(duì)代碼有追求,這本書(shū)可以教會(huì)你寫(xiě)干凈的代碼。
《重構(gòu) 改善既有代碼的設(shè)計(jì)》
重構(gòu)這個(gè)詞大家應(yīng)該不陌生,但是我們靜下心來(lái)想一下,我們?yōu)槭裁匆貥?gòu)?哪些需要重構(gòu)?怎么重構(gòu)?
這是人生終極三問(wèn)啊!
一個(gè)項(xiàng)目開(kāi)始重構(gòu)肯定是因?yàn)橹暗拇a寫(xiě)的太爛了,之前的架構(gòu)不滿足現(xiàn)階段發(fā)展了,大家都在說(shuō)代碼爛、架構(gòu)爛?但好像又說(shuō)不清具體哪里爛,不妨讀讀這本《重構(gòu) 改善既有代碼的設(shè)計(jì)》。
這本書(shū)定義了24 種代碼壞味道,大家可以結(jié)合自己的項(xiàng)目逐個(gè)對(duì)照找出病因?qū)ΠY下藥。
再補(bǔ)充一句:重構(gòu)不是一錘子買(mǎi)賣(mài),重構(gòu)是貫穿項(xiàng)目整個(gè)生命周期的!
總結(jié)
看完這些書(shū)我不能保證你能成為Java 大神,但最起碼你可以很自信地說(shuō):我懂 Java,請(qǐng)給我加薪吧,這是不是夠了!
-- End --
????Java學(xué)習(xí)路線(B站版)整理好了!
作者簡(jiǎn)介:
博主從華中科技大學(xué)碩士畢業(yè),是一個(gè)對(duì)技術(shù)有追求,對(duì)生活有激情的程序員。
幾年間浪跡于多個(gè)一線互聯(lián)網(wǎng)大廠,具有多年開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn)。如果你熱愛(ài)技術(shù)或者你也不滿足現(xiàn)狀喜歡搞事情,那你不妨關(guān)注我,讓我們一路同行,一起分享技術(shù)干貨、交流面試技巧,吐槽職場(chǎng)故事。
我有技術(shù)和故事,你來(lái)嗎?
不要白嫖我,三連支持一下吧 [doge]
