在上一篇文章中,我們主要討論的是如何做一個(gè)Java Web項(xiàng)目盘寡,以及前期需要哪些方面的基礎(chǔ)楚殿。最后,我還推薦了幾個(gè)比較不錯(cuò)的視頻課程竿痰,以便給大家參考脆粥。
當(dāng)然,跟著視頻課程做完一個(gè)項(xiàng)目影涉,你只是照葫蘆畫瓢又練習(xí)了一遍变隔,可能其中有很多東西你并不太理解,比如你可能不知道為什么代碼要分層蟹倾,為什么要用maven進(jìn)行線上編譯匣缘,為什么Tomcat啟動時(shí)會輸出那么多的日志。
有疑問很正常鲜棠,因?yàn)橐粋€(gè)Java Web項(xiàng)目涉及的技術(shù)還是很多的肌厨,如果要理解這些技術(shù)的原理,光靠一個(gè)項(xiàng)目課程是遠(yuǎn)遠(yuǎn)不夠的豁陆。所以柑爸,在你體驗(yàn)了Java Web項(xiàng)目的開發(fā)流程以后,你應(yīng)該花些時(shí)間去了解相關(guān)技術(shù)原理了盒音,今天我們要講的也是這部分內(nèi)容竖配。
對于即將參加校招的同學(xué)來說,最重要的也是這部分內(nèi)容里逆,你需要了解JVM虛擬機(jī)原理进胯,Java并發(fā)原理,并且熟悉JDK的部分源碼原押,了解這些API的底層實(shí)現(xiàn)胁镐。除此之外,還有很多诸衔,下面我們分別來談一談盯漂。
01 計(jì)算機(jī)基礎(chǔ)知識
計(jì)算機(jī)基礎(chǔ)課程(非科班)
如果你不是計(jì)算機(jī)專業(yè)的同學(xué),那你可能要注意一下了笨农。在學(xué)習(xí)下面這些內(nèi)容之前就缆,你最好要學(xué)習(xí)一下計(jì)算機(jī)基礎(chǔ)課程。
這里我們說的計(jì)算機(jī)課程是:數(shù)據(jù)結(jié)構(gòu)谒亦,操作系統(tǒng)竭宰,計(jì)算機(jī)網(wǎng)絡(luò)空郊。
數(shù)據(jù)結(jié)構(gòu):這門課應(yīng)該算是三門課程比較簡單的一門了,推薦《數(shù)據(jù)結(jié)構(gòu)與算法(Java語言描述)》切揭,看書結(jié)合代碼實(shí)踐狞甚,把基本的數(shù)據(jù)結(jié)構(gòu)算法寫一寫就可以了。
操作系統(tǒng):關(guān)于操作系統(tǒng)我看了很多本書廓旬,但是沒有感覺特別好的哼审,所以如果有時(shí)間的話可以先看另外一本書《深入理解計(jì)算機(jī)系統(tǒng)》,這本書講了很多計(jì)算機(jī)的基本概念孕豹,不局限于操作系統(tǒng)涩盾。
然后可以看一看湯小丹寫的《操作系統(tǒng)》,或者你們學(xué)校的教材励背。
計(jì)算機(jī)網(wǎng)絡(luò):網(wǎng)絡(luò)方面的書也非常多旁赊,推薦看一下《計(jì)算機(jī)網(wǎng)絡(luò):自頂向下方法》,另外還有一本《TCP/IP 詳解:卷一》也是備受推崇的書椅野。
除此之外终畅,我還要推薦一下劉欣老師的書《碼農(nóng)翻身》,書中用一些有趣的故事來講解操作系統(tǒng)和計(jì)算網(wǎng)絡(luò)的一些復(fù)雜概念竟闪,有助于大家理解這部分內(nèi)容离福。
02 JVM虛擬機(jī)
JVM虛擬機(jī)
為什么把JVM放在第一位,因?yàn)樗亲罨A(chǔ)也最重要的一塊內(nèi)容炼蛤。所有的Java代碼都運(yùn)行在JVM上妖爷,事實(shí)上,JVM在操作系統(tǒng)中只是一個(gè)進(jìn)程理朋。為了了解Java代碼的運(yùn)行方式絮识,底層引擎的執(zhí)行原理,以及內(nèi)存的分配情況嗽上,我們必須要學(xué)習(xí)JVM虛擬機(jī)次舌。
推薦資源:《深入理解JVM虛擬機(jī)》
很高興地告訴你們,學(xué)習(xí)JVM你只需要把這本書吃透即可兽愤,當(dāng)然彼念,看一遍可不夠,筆者前后至少看了三遍浅萧,有條件的話最好把書中的實(shí)例都跑一跑逐沙。
另外,JVM也是面試必考的內(nèi)容洼畅,所以吩案,相應(yīng)地去準(zhǔn)備一些面試題也是很有必要的,如果你基本掌握了這本書的內(nèi)容帝簇,相信你不會懼怕任何JVM面試題徘郭。
03 設(shè)計(jì)模式與源碼閱讀
設(shè)計(jì)模式
為什么在這里提到設(shè)計(jì)模式呢靠益,因?yàn)樵O(shè)計(jì)模式是Java編程規(guī)范的經(jīng)典總結(jié),并且在JDK源碼中經(jīng)常使用崎岂,由于我們后面會講到JDK源碼方面的學(xué)習(xí),所以對于設(shè)計(jì)模式闪湾,建議大家先學(xué)習(xí)一下冲甘,最好的學(xué)習(xí)方式就是看書結(jié)合實(shí)踐,把一些常用的設(shè)計(jì)模式自己實(shí)現(xiàn)一下途样。
推薦資源:《head first 設(shè)計(jì)模式》
JDK源碼(主要指集合類源碼)
接下來下場的選手是:JDK源碼江醇。不過對于大部分人來說,只要能夠掌握集合類何暇,字符串這些源碼就可以了陶夜,其他部分的源碼主要集中在JUC并發(fā)包里,而這些內(nèi)容我們會放在Java并發(fā)技術(shù)里來講裆站。
為什么我們需要掌握集合類源碼呢条辟,其一是因?yàn)槊嬖囅矚g考,其二是因?yàn)榧项惖脑创a實(shí)現(xiàn)都比較經(jīng)典宏胯,難度也不算太大羽嫡,并且運(yùn)用了很多優(yōu)化方法,所以了解它對于學(xué)習(xí)Java的同學(xué)來說大有裨益肩袍。
推薦資源
市面上并沒有哪本書專門來講JDK源碼的杭棵,所以這部分內(nèi)容的學(xué)習(xí)資源主要是兩個(gè)部分,一是JDK源碼本身氛赐,而是一些技術(shù)博客魂爪。
1 對于JDK源碼,直接看可能比較有難度艰管,不推薦新手這么做滓侍。 2 講解源碼的文章質(zhì)量參差不齊,所以我只推薦幾個(gè)我自己比較熟悉的牲芋,一個(gè)是importnew粗井。
Spring源碼
說實(shí)話,Spring源碼的復(fù)雜度遠(yuǎn)高于集合類的源碼街图,這也是因?yàn)镾pring運(yùn)用了很多的設(shè)計(jì)模式浇衬,并且有著非常繁雜的類關(guān)系。所以餐济,我不建議大家直接去讀Spring源碼耘擂,因?yàn)榧词故强碨pring源碼解析的書籍,你也會感到很吃力絮姆。
所以醉冤,我推薦的方式是秩霍,看書+看一些比較好的源碼解析文章。另外要告訴大家的是蚁阳,Spring的源碼很多铃绒,并不是所有內(nèi)容都需要你掌握的,大家都知道Spring最常用的特性就是IOC和AOP螺捐,所以看源碼解析時(shí)颠悬,最重要的也是這兩個(gè)部分了。
另外定血,看完Spring的源碼解析以后赔癌,別忘了看SpringMVC的源碼解析,學(xué)習(xí)方法也是一樣的澜沟,找重點(diǎn)內(nèi)容看即可灾票。
04 Java并發(fā)技術(shù)
Java并發(fā)技術(shù)
相信你為了搞定集合類源碼和Spring源碼花了不少功夫了,接下來輪到Java并發(fā)技術(shù)出場了茫虽。我們在入門篇其實(shí)已經(jīng)談到了多線程刊苍,但是也僅僅停留在使用Thread或者Runnable實(shí)現(xiàn)簡單的多線程demo。
實(shí)際上濒析,為了理解Java并發(fā)技術(shù)的底層實(shí)現(xiàn)班缰,我們還需要知道JMM模型,了解synchronized和volatile的底層實(shí)現(xiàn)悼枢,同時(shí)還要明白Java中的多線程和操作系統(tǒng)的多線程和什么聯(lián)系和區(qū)別埠忘。除此之外,我們經(jīng)常談到的線程安全馒索,有哪些實(shí)現(xiàn)方法莹妒,也是這部分內(nèi)容的要點(diǎn)。
學(xué)習(xí)并發(fā)技術(shù)绰上,我建議分為三個(gè)步驟
1 首先熟悉Java的多線程基礎(chǔ)知識旨怠,比如Thread的使用,線程的狀態(tài)轉(zhuǎn)換蜈块,以及一些api的使用方式鉴腻。 2 了解一些理論基礎(chǔ),比如JMM百揭,操作系統(tǒng)的多線程實(shí)現(xiàn)爽哎。這部分內(nèi)容推薦通過看書和看博客來學(xué)習(xí)。 3 了解并使用JUC的一些API器一,然后開始看JUC的一些源代碼课锌。這個(gè)階段是最重要也是最困難的。
推薦資源: 書籍:《Java并發(fā)編程藝術(shù)》祈秕,《Java并發(fā)編程實(shí)戰(zhàn)》
05 Java網(wǎng)絡(luò)編程
Java網(wǎng)絡(luò)編程
在搞懂Java并發(fā)編程技術(shù)之后渺贤,相信這部分內(nèi)容也難不倒你雏胃。當(dāng)然,前提是你對計(jì)算機(jī)網(wǎng)絡(luò)有一定了解志鞍,因?yàn)榫W(wǎng)絡(luò)編程涉及到TCP和HTTP相關(guān)的知識點(diǎn)瞭亮。
在學(xué)習(xí)這部分內(nèi)容的時(shí)候,你首先要了解socket的使用以及原理固棚,然后再去了解NIO的相關(guān)API统翩,多寫一些客戶端和服務(wù)端通訊的demo,以便熟悉這些內(nèi)容玻孟。為了更好地理解網(wǎng)絡(luò)編程唆缴,你還要去了解UNIX網(wǎng)絡(luò)編程模型鳍征。
除此之外黍翎,如果你想要更好地理解Java網(wǎng)絡(luò)編程,你還需要去了解Tomcat的實(shí)現(xiàn)原理艳丛。同時(shí)匣掸,Netty也是值得你去學(xué)習(xí)的一部分內(nèi)容,最好有機(jī)會去用一用這一網(wǎng)絡(luò)編程框架氮双,學(xué)有余力的同學(xué)還可以考慮看看它的源碼(筆者沒有看)碰酝。
05 Java8
Java的版本一直在更新,但目前在用的主要還是Java8和Java7戴差,等再過幾年可能這部分的內(nèi)容就過時(shí)了送爸。但是目前看來,對Java8的學(xué)習(xí)和了解還是很重要的暖释,畢竟面試也喜歡考袭厂。
對這部分內(nèi)容學(xué)習(xí)的最好方式就是:看文章+代碼實(shí)踐
推薦資源:《Java8實(shí)戰(zhàn)》
06 總結(jié)
今天的內(nèi)容貌似有點(diǎn)多,大家會不會感覺有點(diǎn)吃不消呢球匕。沒關(guān)系纹磺,因?yàn)檫@部分內(nèi)容確實(shí)需要花很多時(shí)間去學(xué)習(xí)。對于一個(gè)在校的Java學(xué)習(xí)者來說亮曹,可能沒有機(jī)會接觸到多么高大上的項(xiàng)目橄杨,所以對內(nèi)功的修煉顯得格外重要。
看書照卦,寫demo式矫,讀源碼,看似簡單的事情實(shí)際上需要花費(fèi)大量時(shí)間和精力役耕,這個(gè)過程是需要你靜下心來衷佃,慢慢沉淀的,在學(xué)習(xí)的過程中你也可以和筆者一樣蹄葱,寫一些總結(jié)和博客氏义,以便更好地回顧自己的學(xué)習(xí)歷程锄列。
總結(jié)以下今天所講的內(nèi)容吧:
1 計(jì)算機(jī)基礎(chǔ)課程:數(shù)據(jù)結(jié)構(gòu),網(wǎng)絡(luò)和操作系統(tǒng) 2 JVM基本原理 3 設(shè)計(jì)模式惯悠,JDK源碼邻邮,Spring源碼 4 Java并發(fā)技術(shù),JUC源碼 5 Java網(wǎng)絡(luò)編程 6 Java8