JDK其實就是Java SE Development Kit的縮寫,要玩好這東西可不簡單。JDK主要包含了三部分,部分就是Java運行時環境,這其實就是JVM。此外,第二部分就是Java的基礎類庫,這個類庫的數量還是非常可觀的。后,第三部分就是Java的開發工具,它們都是輔助你更好的使用Java的利器。
那么很顯然,要玩好JDK,就是要玩好JDK的這三部分。接下來,咱們就逐個的來說一下,每一個部分要學什么,學到什么程度。
這一部分其實就是常說的jre,而它的核心其實就一個東西,就是JVM。
JVM這個東西,它的重要性我不想再強調了,JVM那本書甚至比《Thinking in java》還重要,這已經足見我多么看重JVM了。
當然了,只是我看重,當然沒什么卵用,但只要Java稍微高級一點點的職位,這部分基本上都是面試必問內容,這更加說明了JVM的重要性。
所以,對于JVM,沒什么可說的,就是往死里學,往死里研究,能有多深就多深!
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
精讀源碼,這是要求高的級別。但是,要求你精讀源碼并不意味著,這些類就是重要的。而是因為,我覺得這些類比較常用,而且比較簡單,看看它們的源碼有助于鍛煉你看源碼的感覺,也了解一下大神們寫代碼的風格。
看這些源碼的目的,更多是為了增加你的閱讀代碼能力。而且,我這里必須要強調一下,像Exception和Error這一類的,就不用讀源碼了,親。
其實上面三個包都有一個共同點,那就是這三個包,基本上都是你常用的了。lang包不用說了,你隨便寫點啥都得用到,io包和util包也是你平時讀寫文件和使用數據結構必不可少的。
看源碼從這些常用的包下手找手感,我個人覺得再合適不過。
第二級別:深刻理解
該級別包含的包如下:
java.lang.reflect
java.net
javax.net.*
java.nio.*
java.util.concurrent.*
深刻理解,這個看似比精讀源碼要求低的級別,其實恰恰是重要的。這個級別要求的類,全都是一些進階到高級所必須了解的。
當然了,這里要強調一點的是,我說這些類要深刻理解,而沒說要看它們源碼,并不是說這些類的源碼不能看,或者看了沒用。而是這些類的源碼往往非常復雜,要了解清楚細節花費的時間是非常多的,因此,花費巨量的時間去研究這么復雜的代碼其實沒必要的。
不過,如果你在使用這些類的過程中,遇到了問題,這個時候如果看它們源碼可以解決的話,那就不要再矜持了,果斷看看源碼解決你的問題吧,這是適合的看源碼的契機了。
小小的透露一下,我看過的JDK源碼,基本上全是這么看過來的。遇到了問題不要百度和谷歌,看源碼能解決你90%的問題。
此外,看到這四個包的名字,不難看出它們各自代表了什么。reflect代表了反射,net代表了網絡IO,nio代表了非阻塞io,concurrent代表了并發。
這四個家伙可以說每一個都夠面試官問上半天的,而且,這四個包的內容,如果你要深刻理解的話,其實還牽扯了很多其它的知識。
舉個例子,反射你要了解清楚的話,你是不是要搞明白JVM的類加載機制?網絡IO要搞清楚的話,你是不是要清楚TCP/IP和HTTP、HTTPS?包括并發包,如果你要搞清楚的話,是不是要了解并發的相關知識?因此,這四個包要徹底搞清楚,還是需要花費一定時間和精力的。但是,請相信我,這絕對是值得的,甚至可以說,這四個包用的夠不夠叼,基本決定了一個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這些玩意兒。什么?你說你經常用它們?如果真的是這樣的話,那么我只能遺憾的告訴你,趕緊跳槽吧,你待在這公司沒啥前途的,0-0。
這些開發工具主要就是輔助你開發的了,javac應該是常用的一個了,雖然你幾乎不用手動執行它。此外,其實還有一些比較實用的工具,可以幫助你排查問題。而且有的面試官,也會問你這類問題,比如問你平時都用什么工具排查問題。我覺得比較實用的幾個工具主要有jmap、jconsole、jstack、jvisualvm,至于這幾個工具有什么作用,我這里就不提了,如果你要了解這些命令的詳細內容,可以去谷歌或者官網上找,還是非常好找的。當然,如果你有興趣的話,也可以自己去JDK的bin目錄下找找,看有沒有什么更好玩的工具。
好了,到這里基本上就把“玩好JDK”這件事說完了。總的來說,級別和第二級別是重要的。更簡單的說,可以把級別的那些包稱作基礎,第二級別的那些包稱為進階。至于第三級別和第四級別的那些包,就沒什么可說的了。當然了,重要的還是那萬年不變的JVM,請記住了,JVM才是你Java根基的根本,就是再牛逼的類,沒了JVM它也就是一個無用的class文件而已。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。