學(xué)多少年才算“精通Java”?

?我從畢業(yè)做程序員就開始用 Java,到現(xiàn)在已經(jīng)工作快 20 年了。減去我做手游用 C++、Lua 的幾年,再減去后來(lái)轉(zhuǎn)管理寫代碼少的時(shí)間,我真正寫 Java 代碼的時(shí)間至少也在 10 年以上。

如果你問我“Java 已經(jīng)精通了嗎?”,說實(shí)話,還是有點(diǎn)心虛。

Java 博大精深,那么多知識(shí)點(diǎn),肯定有我不懂的。另外,每個(gè)人對(duì)“精通”都有自己的理解,有人覺得是精于使用,有人覺得是精于底層原理,也有人覺得是精于框架。

但是,畢竟用 Java 十多年了,我可以說說我自己對(duì)“精通 Java”的理解。

Java 語(yǔ)言覆蓋的知識(shí)很廣泛,但是總的來(lái)說,最重要的是以下三個(gè)方面:

Java 基礎(chǔ)知識(shí)

Java 并發(fā)編程

JVM 底層知識(shí)

所以,所謂精通 Java 語(yǔ)言,可以大致等同于視為上述三個(gè)方面的精通。

Java 基礎(chǔ)知識(shí)的精通主要體現(xiàn)在,能很順暢的把 Java 的各種基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)、各種內(nèi)置對(duì)象,都融合到實(shí)際的場(chǎng)景中,能以最快的速度、最佳的方案,去解決實(shí)際中的工作問題。

比如,大家在項(xiàng)目中,經(jīng)常是不會(huì)區(qū)分對(duì)象是強(qiáng)引用還是弱引用的,統(tǒng)統(tǒng)都是強(qiáng)引用。如果一個(gè)精通 Java 基礎(chǔ)知識(shí)的工程師,就會(huì)根據(jù)實(shí)際情況,去靈活地運(yùn)用強(qiáng)引用、弱引用。

Java 并發(fā)編程的精通主要體現(xiàn)在,能非常巧妙得把各種多線程設(shè)計(jì)模式以及并發(fā)包中的各種工具,去解決各種并發(fā)難題。

例如,使用 Future 和相關(guān)子類去提升程序的運(yùn)行效率,用 CountDownLatch 去控制線程順序。

對(duì)JVM 底層知識(shí)的精通主要體現(xiàn)在,能很快速地通過優(yōu)化 JVM,去提升項(xiàng)目的性能,也能非常迅速準(zhǔn)確地去找到項(xiàng)目出現(xiàn)的底層問題,直接進(jìn)行根源性的解決。

比如,我們正在寫一個(gè)要嵌入到對(duì)方項(xiàng)目的一個(gè)監(jiān)控客戶端。這個(gè)客戶端就需要保證不能因?yàn)樗那度耄瑢?dǎo)致被嵌入項(xiàng)目的 CPU、內(nèi)存出現(xiàn)大的耗費(fèi)。也要保證,在不耗費(fèi)大資源的情況下,還能快速無(wú)誤地傳遞數(shù)據(jù)。這時(shí)候,我們就應(yīng)該利用自己對(duì) JVM 垃圾回收的深入理解,去搞對(duì)象池化。

總之,Java 語(yǔ)言本身的精通,就體現(xiàn)在能利用 Java 去最優(yōu)的提供技術(shù)解決方案,也能創(chuàng)造性的解決各種復(fù)雜的技術(shù)難題。

下面咱們就分開看看,如何能精通這些知識(shí)和技能。

一、精通 Java 基礎(chǔ)知識(shí)

要精通 Java 基礎(chǔ)知識(shí),大家可以深度思考一下我對(duì)各個(gè)知識(shí)點(diǎn)提出的幾個(gè)問題:

Java 的類型轉(zhuǎn)換

Java 是一種強(qiáng)類型語(yǔ)言,在編程中就離不開各種各樣的類型轉(zhuǎn)換。

可是大家有沒有想過強(qiáng)制變換的底層細(xì)節(jié)是什么?有沒有反過來(lái)想過,為什么 Java 向上轉(zhuǎn)型是自動(dòng)的,而向下轉(zhuǎn)型卻是強(qiáng)制的?

Java 的集合框架

Java 的集合框架用途是如此廣泛,只要你開發(fā)個(gè)稍微復(fù)雜點(diǎn)的項(xiàng)目,就根本避不開要用它。在學(xué)習(xí)的時(shí)候,大家可以想想這么幾個(gè)問題:

Java 的集合框架中的各種集合的最佳使用場(chǎng)景都是什么?

集合框架中的各種集合的子類實(shí)現(xiàn)都是為了解決他們父類的哪些不足的?

為什么在有了 Java 的集合框架后,我們還要使用 Guava 框架?

Java 的數(shù)組

Java 的數(shù)組大家都經(jīng)常用了,可大家有沒有想過:

我們什么時(shí)候使用數(shù)組,什么時(shí)候使用集合?

Java 的底層是如何對(duì)數(shù)組的越界進(jìn)行檢查的?

為什么 System.arrayCopy 方法會(huì)那么快?

Java 的 String

你有沒有仔細(xì)看過 String 的代碼呢?

有沒有想過 String 為什么是不變的呢?

String 中的哪些方法創(chuàng)造出共享同一個(gè) char 數(shù)組的字符串,又有哪些創(chuàng)造出有獨(dú)立的 char 數(shù)組字符串呢?

接口和抽象類

Java 的接口和抽象類,在項(xiàng)目中如何最合適的使用一直都是一個(gè)不好解決的難題。大家在學(xué)習(xí)接口和抽象類的時(shí)候,可以想想:

Java 的接口相比抽象類有什么優(yōu)勢(shì)?又有什么劣勢(shì)?

它們之間的特點(diǎn)各有什么不同?

有沒有去看過一些開源項(xiàng)目中各個(gè)抽象類和接口是如何定義和使用的?

equals 和 hashcode

Java 的 equals 和 hashcode 方法之間總是有著重要的關(guān)聯(lián)。

為什么重寫 equals 方法要求 hashcode 方法也要跟著重寫?

hashcode 方法都有哪些用處?

Java 的泛型和枚舉

Java 的泛型和枚舉對(duì)初學(xué)者來(lái)說是個(gè)比較難理解的知識(shí)點(diǎn)。還請(qǐng)大家多去查證一下:

泛型和枚舉是為了解決什么問題才會(huì)被引入的?

Java 的泛型和枚舉都有什么獨(dú)有的特點(diǎn)?

泛型和枚舉使用最經(jīng)常出現(xiàn)的錯(cuò)誤都有哪些?

Java 的 IO、NIO

IO 和 NIO 這里的學(xué)習(xí),我在以前的文章也提過幾次了。除了以前文章提過的一些學(xué)習(xí)建議,這里也有幾個(gè)問題還請(qǐng)大家思考一下:

Java 的 IO 有什么缺陷才會(huì)引入 NIO 的?

NIO 中有哪些是經(jīng)常被開源框架著重使用的?

Java 的網(wǎng)絡(luò)編程

Java 的網(wǎng)絡(luò)原生編程大家可能真的不常用,但是它確實(shí)是 Java 中的非常重要的基礎(chǔ),Java 的各種和網(wǎng)絡(luò)相關(guān)的重要開源框架,之所以能擁有如此卓越的性能,都離不開 Java 原生網(wǎng)絡(luò)底層優(yōu)秀。

常用的 Java 開源網(wǎng)絡(luò)框架,常用的編程模式有哪些?

Java 提供的網(wǎng)絡(luò)編程基礎(chǔ),是不是還有什么不足之處?

Java 的正則表達(dá)式

Java 的正則表達(dá)式,可能很多工作多年的程序員掌握的也不好。但是,在做字符串匹配相關(guān)的業(yè)務(wù)時(shí),是繞不開它的。

大家除了學(xué)習(xí)怎么使用正則表達(dá)式以外,還需要思考下:

有相同功能,但是寫法不同的正則表達(dá)式之間,性能是不是有大的差別?

正則表達(dá)式能不能表達(dá)取反這個(gè)邏輯?

正則表達(dá)式在匹配上有哪些不夠用的地方?

Java 的 JDBC

為什么我們總是習(xí)慣于 JDBC 的框架?

我們有沒有辦法使用 JDBC 去獲取數(shù)據(jù)庫(kù)中的各種元數(shù)據(jù)?

JDBC 的整體架構(gòu)是什么樣的?

有沒有什么獨(dú)特的地方你曾經(jīng)在某些開源框架中見過?

Date、Time、Calendar

Java 的 Date、Time、Calendar 為什么難用?

有沒有你覺得可以改進(jìn)的地方?

為什么 JodaTime 這個(gè)框架會(huì)被人認(rèn)為勝過 Java 的原生 Date、Time等。

2、精通 Java 并發(fā)編程

要精通 Java 并發(fā)編程,像準(zhǔn)確理解進(jìn)程和線程啊,弄懂死鎖、Race Condition、編程模式什么的啊,已經(jīng)算是必要的前提了。在這個(gè)基礎(chǔ)上,大概要在基礎(chǔ)上再深入學(xué)習(xí)如下三個(gè)方面:

線程的基礎(chǔ)知識(shí)

這部分注意兩個(gè)細(xì)微的知識(shí)點(diǎn)以及理解一個(gè)模型。

第一個(gè)知識(shí)點(diǎn)是 volatile 的特性,使用場(chǎng)景和底層實(shí)現(xiàn)細(xì)節(jié)。第二個(gè)知識(shí)點(diǎn)是 wait 和 sleep 的區(qū)別,掌握到 JVM 實(shí)現(xiàn)細(xì)節(jié)最好。

這兩個(gè)知識(shí)點(diǎn)是妨礙咱們精通線程知識(shí)的兩大主要阻礙。

除了這兩個(gè)知識(shí)點(diǎn),更要深入理解的就是 Java 的內(nèi)存模型——除了了解 Java 的內(nèi)存模型是個(gè)什么東西之外,還需要知道 Java 的內(nèi)存模型為什么這樣設(shè)計(jì),這樣設(shè)計(jì)的好處是什么,帶來(lái)的問題又是什么?

Java 并發(fā)框架

這里說的并發(fā)框架,主要說的是 java.util.concurrent 下的接口和類。

建議除了跟著書練習(xí)一遍使用之外,最好是把里面的源碼讀一下。

多線程編程模式

以前我說大家找工作了解下多線程編程模式,看書就可以了。但是要精通的話,除了看書之外,最好找一些著名開源項(xiàng)目來(lái)學(xué)習(xí)。

比如 Netty,對(duì)照著多線程編程模式,把 Netty 中實(shí)現(xiàn)的模式代碼都好好看一遍,明白各種模式的優(yōu)缺點(diǎn)和模式之間是如何一起混用以達(dá)到最佳效果的。

3、精通 JVM 底層

對(duì)于 JVM 的學(xué)習(xí),我曾經(jīng)寫過一篇文章,大家可以參考學(xué)習(xí):如何學(xué)JVM

除了這篇文章的建議以外,我最近對(duì)研究 JVM 又有了一些新的感悟,補(bǔ)充如下:

字節(jié)碼方面:可以看《深入理解 JVM 字節(jié)碼》

JVM 的垃圾回收方面:建議以《垃圾回收的算法與實(shí)現(xiàn)》為綱領(lǐng),開始選擇性的讀《深入 Java 虛擬機(jī):JVM G1GC 的算法與實(shí)現(xiàn)》,《JVM G1 源碼分析和調(diào)優(yōu)》其中一本書。

以上就是我對(duì)“精通 java”的理解。

怎么樣,看完是不是心情很沉重,感覺學(xué)不動(dòng)了?有這種感覺很正常,如果時(shí)間倒回十幾年,我一下看到這么多內(nèi)容我也發(fā)愁。

以上說的是給大家一個(gè)參考,你也可以問問身邊的技術(shù)大牛對(duì)精通的理解。然后結(jié)合自己的工作現(xiàn)狀,找到一個(gè)自己認(rèn)可的方向,慢慢學(xué)起了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容