#引言html
不少人對於公司的招聘要求中寫的,要有「紮實的Java基礎」,都很迷茫。
這特麼到底啥意思?什麼東西算做Java基礎?學到什麼程度纔算紮實?答案就是玩好JDK就能夠了。java
#玩好JDK程序員
JDK其實就是Java SE Development Kit的縮寫,要玩好這東西可不簡單。JDK主要包含了三部分,第一部分就是Java運行時環境,這其實就是JVM。此外,第二部分就是Java的基礎類庫,這個類庫的數量仍是很是可觀的。最後,第三部分就是Java的開發工具,它們都是輔助你更好的使用Java的利器。
那麼很顯然,要玩好JDK,就是要玩好JDK的這三部分。接下來,我們就逐個的來講一下,每個部分要學什麼,學到什麼程度。面試
##第一部分:Java運行時環境sql
這一部分其實就是常說的jre,而它的核心其實就一個東西,就是JVM。JVM那本書甚至比《Thinking in java》還重要,只要Java稍微高級一點點的職位,這部分基本上都是面試必問內容,這更加說明了JVM的重要性。
因此,對於JVM,沒什麼可說的,就是往死裏學,往死裏研究,能有多深就多深!數據庫
##第二部分:Java的基礎類庫bootstrap
Java的基礎類庫從你剛開始學Java就開始接觸了,可是,直到你結束整個Java生涯,你都不必定能把全部的類都見一遍。
說明了什麼?是否是說明了Java基礎類庫的龐大?錯!大錯特錯!這其實真正說明的是,有不少類你徹底沒必要要care它們,由於它們從你接觸Java到放棄,都不必定能接觸到。因此,搞清楚哪些類重要,哪些類不重要,就很是有必要了。這可讓你以最短的時間,作最有價值的事。
首先咱們來看看,Java基礎類庫的包都有哪些,爲了使得本文更有表明性,咱們取JDK6的包列表。網絡
java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font java.awt.geom java.awt.im java.awt.im.spi java.awt.image java.awt.image.renderable java.awt.print java.beans java.beans.beancontext java.io java.lang java.lang.annotation java.lang.instrument java.lang.management java.lang.ref java.lang.reflect java.math java.net java.nio java.nio.channels java.nio.channels.spi java.nio.charset java.nio.charset.spi java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server java.security java.security.acl java.security.cert java.security.interfaces java.security.spec java.sql java.text java.text.spi java.util java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks java.util.jar java.util.logging java.util.prefs java.util.regex java.util.spi java.util.zip javax.accessibility javax.activation javax.activity javax.annotation javax.annotation.processing javax.crypto javax.crypto.interfaces javax.crypto.spec javax.imageio javax.imageio.event javax.imageio.metadata javax.imageio.plugins.bmp javax.imageio.plugins.jpeg javax.imageio.spi javax.imageio.stream javax.jws javax.jws.soap javax.lang.model javax.lang.model.element javax.lang.model.type javax.lang.model.util javax.management javax.management.loading javax.management.modelmbean javax.management.monitor javax.management.openmbean javax.management.relation javax.management.remote javax.management.remote.rmi javax.management.timer javax.naming javax.naming.directory javax.naming.event javax.naming.ldap javax.naming.spi javax.net javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event javax.rmi javax.rmi.CORBA javax.rmi.ssl javax.script javax.security.auth javax.security.auth.callback javax.security.auth.kerberos javax.security.auth.login javax.security.auth.spi javax.security.auth.x500 javax.security.cert javax.security.sasl javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi javax.sql javax.sql.rowset javax.sql.rowset.serial javax.sql.rowset.spi javax.swing javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.plaf.synth javax.swing.table javax.swing.text javax.swing.text.html javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo javax.tools javax.transaction javax.transaction.xa javax.xml javax.xml.bind javax.xml.bind.annotation javax.xml.bind.annotation.adapters javax.xml.bind.attachment javax.xml.bind.helpers javax.xml.bind.util javax.xml.crypto javax.xml.crypto.dom javax.xml.crypto.dsig javax.xml.crypto.dsig.dom javax.xml.crypto.dsig.keyinfo javax.xml.crypto.dsig.spec javax.xml.datatype javax.xml.namespace javax.xml.parsers javax.xml.soap javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform javax.xml.transform.dom javax.xml.transform.sax javax.xml.transform.stax javax.xml.transform.stream javax.xml.validation javax.xml.ws javax.xml.ws.handler javax.xml.ws.handler.soap javax.xml.ws.http javax.xml.ws.soap javax.xml.ws.spi javax.xml.ws.wsaddressing javax.xml.xpath org.ietf.jgss org.omg.CORBA org.omg.CORBA_2_3 org.omg.CORBA_2_3.portable org.omg.CORBA.DynAnyPackage org.omg.CORBA.ORBPackage org.omg.CORBA.portable org.omg.CORBA.TypeCodePackage org.omg.CosNaming org.omg.CosNaming.NamingContextExtPackage org.omg.CosNaming.NamingContextPackage org.omg.Dynamic org.omg.DynamicAny org.omg.DynamicAny.DynAnyFactoryPackage org.omg.DynamicAny.DynAnyPackage org.omg.IOP org.omg.IOP.CodecFactoryPackage org.omg.IOP.CodecPackage org.omg.Messaging org.omg.PortableInterceptor org.omg.PortableInterceptor.ORBInitInfoPackage org.omg.PortableServer org.omg.PortableServer.CurrentPackage org.omg.PortableServer.POAManagerPackage org.omg.PortableServer.POAPackage org.omg.PortableServer.portable org.omg.PortableServer.ServantLocatorPackage org.omg.SendingContext org.omg.stub.java.rmi org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.xml.sax org.xml.sax.ext org.xml.sax.helpers``` 怎麼樣?是否是被嚇到了?這麼多包,並且還這麼多陌生的包名,有的連見都沒見過,這特麼怎麼玩?將這些包一共分爲四個級別。 ###第一級別:精讀源碼 該級別包含的包以下:
java.io java.lang java.util```數據結構
精讀源碼,這是要求最高的級別。可是,要求你精讀源碼並不意味着,這些類就是最重要的。而是由於,LZ以爲這些類比較經常使用,並且比較簡單,看看它們的源碼有助於鍛鍊你看源碼的感受,也瞭解一下大神們寫代碼的風格。
看這些源碼的目的,更可能是爲了增長你的閱讀代碼能力。並且,LZ這裏必需要強調一下,像Exception和Error這一類的,就不用讀源碼了,親。
其實上面三個包都有一個共同點,那就是這三個包,基本上都是你最經常使用的了。lang包不用說了,你隨便寫點啥都得用到,io包和util包也是你平時讀寫文件和使用數據結構必不可少的。併發
###第二級別:深入理解
該級別包含的包以下:
java.lang.reflect java.net javax.net.* java.nio.* java.util.concurrent.*``` 深入理解,這個看似比精讀源碼要求低的級別,其實偏偏是最重要的。這個級別要求的類,全都是一些進階到高級所必須瞭解的。 固然了,這裏要強調一點的是,LZ說這些類要深入理解,而沒說要看它們源碼,並非說這些類的源碼不能看,或者看了沒用。而是這些類的源碼每每很是複雜,要了解清楚細節花費的時間是很是多的,所以,花費巨量的時間去研究這麼複雜的代碼其實不必的。 不過,若是你在使用這些類的過程當中,遇到了問題,這個時候若是看它們源碼能夠解決的話,那就不要再矜持了,果斷看看源碼解決你的問題吧,這是最適合的看源碼的契機了。 此外,看到這四個包的名字,不難看出它們各自表明了什麼。reflect表明了反射,net表明了網絡IO,nio表明了非阻塞io,concurrent表明了併發。 這四個傢伙能夠說每個都夠面試官問上半天的,並且,這四個包的內容,若是你要深入理解的話,其實還牽扯了不少其它的知識。 舉個例子,反射你要了解清楚的話,你是否是要搞明白JVM的類加載機制?網絡IO要搞清楚的話,你是否是要清楚TCP/IP和HTTP、HTTPS?包括併發包,若是你要搞清楚的話,是否是要了解併發的相關知識? 所以,這四個包要完全搞清楚,仍是須要花費必定時間和精力的。 可是,請相信LZ,這絕對是值得的,甚至能夠說,這四個包用的夠不夠叼,基本決定了一個Java程序員所處的檔次。 ###第三級別:會用便可 該級別包含的包以下: ```java.lang.annotation javax.annotation.* java.lang.ref java.math java.rmi.* javax.rmi.* java.security.* javax.security.* java.sql javax.sql.* javax.transaction.* java.text javax.xml.* org.w3c.dom.* org.xml.sax.* javax.crypto.* javax.imageio.* javax.jws.* java.util.jar java.util.logging java.util.prefs java.util.regex java.util.zip``` 會用便可,這個級別的要求很顯然了,就是會用就能夠了。這些包大部分都是在特定的狀況下會用到,但卻不會時刻用到。 就像sql包和transaction包,就是操做數據庫時用到的。而xml、dom和sax這些,都是操做xml時用到的。其它的包也都是相似的,有使用註解時用的,有遠程方法調用時用的,也有涉及到加密時用到的等等。 這些包在面試時通常不會問到,因此它們的重要性天然要低不少,並且也不太須要刻意的去學,用到了研究一下,會用便可。 ###第四級別:請無視它 該級別包含了全部以上沒有提到的包。 這個級別就更不用解釋了,到如今還沒提到的包,基本上能夠忽略,由於你基本上不太可能用到它們,好比swing、awt這些玩意兒。 ##第三部分:Java的開發工具 這些開發工具主要就是輔助你開發的了,javac應該是最經常使用的一個了,雖然你幾乎不用手動執行它。 此外,其實還有一些比較實用的工具,能夠幫助你排查問題。並且有的面試官,也會問你這類問題,好比問你平時都用什麼工具排查問題。 比較實用的幾個工具主要有jmap、jconsole、jstack、jvisualvm,至於這幾個工具備什麼做用,這裏就不提了,若是要了解這些命令的詳細內容,能夠去谷歌或者官網上找,仍是很是好找的。 #小結 好了,到這裏基本上就把「玩好JDK」這件事說完了。 總的來講,第一級別和第二級別是最重要的。 更簡單的說,能夠把第一級別的那些包稱做基礎,第二級別的那些包稱爲進階。至於第三級別和第四級別的那些包,就沒什麼可說的了。 固然了,最重要的仍是那萬年不變的JVM,請記住了,JVM纔是你Java根基的根本,就是再牛逼的類,沒了JVM它也就是一個無用的class文件而已。 若是你想擁有紮實的Java基礎,那就抓緊玩好JDK吧。