JDK的学习思路(摘抄)

时间:2021-05-11 21:06:03

玩好JDK

  

    要玩好JDK,就是要玩好JDK的这三部分。接下来,咱们就逐个的来说一下,每一个部分要学什么,学到什么程度。

 

  第一部分:Java运行时环境

  这一部分其实就是常说的jre,而它的核心其实就一个东西,就是JVM。

  JVM这个东西,它的重要性LZ不想再强调了,在之前的那篇《回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议》中,LZ就说过,JVM那本书甚至比《Thinking in java》还重要,这已经足见LZ多么看重JVM了。

  当然了,只是LZ看重,当然没什么卵用,但只要Java稍微高级一点点的职位,这部分基本上都是面试必问内容,这更加说明了JVM的重要性。

  所以,对于JVM,没什么可说的,就是往死里学,往死里研究,能有多深就多深!

 

  第二部分:Java的基础类库

  Java的基础类库从你刚开始学Java就开始接触了,但是,直到你结束整个Java生涯,你都不一定能把所有的类都见一遍。

  这说明了什么?是不是说明了Java基础类库的庞大?

  错!大错特错!这其实真正说明的是,有很多类你完全不必要care它们,因为它们从你接触Java到放弃,都不一定能接触到。

  所以,搞清楚哪些类重要,哪些类不重要,就非常有必要了。这可以让你以最短的时间,做最有价值的事。

  首先我们来看看,Java基础类库的包都有哪些,为了使得本文更有代表性,我们取JDK6的包列表。

[java] view plain copy
  1. java.applet   
  2. java.awt   
  3. java.awt.color   
  4. java.awt.datatransfer   
  5. java.awt.dnd   
  6. java.awt.event   
  7. java.awt.font   
  8. java.awt.geom   
  9. java.awt.im   
  10. java.awt.im.spi   
  11. java.awt.image   
  12. java.awt.image.renderable   
  13. java.awt.print   
  14. java.beans   
  15. java.beans.beancontext   
  16. java.io   
  17. java.lang   
  18. java.lang.annotation   
  19. java.lang.instrument   
  20. java.lang.management   
  21. java.lang.ref   
  22. java.lang.reflect   
  23. java.math   
  24. java.net   
  25. java.nio   
  26. java.nio.channels   
  27. java.nio.channels.spi   
  28. java.nio.charset   
  29. java.nio.charset.spi   
  30. java.rmi   
  31. java.rmi.activation   
  32. java.rmi.dgc   
  33. java.rmi.registry   
  34. java.rmi.server   
  35. java.security   
  36. java.security.acl   
  37. java.security.cert   
  38. java.security.interfaces   
  39. java.security.spec   
  40. java.sql   
  41. java.text   
  42. java.text.spi   
  43. java.util   
  44. java.util.concurrent   
  45. java.util.concurrent.atomic   
  46. java.util.concurrent.locks   
  47. java.util.jar   
  48. java.util.logging   
  49. java.util.prefs   
  50. java.util.regex   
  51. java.util.spi   
  52. java.util.zip   
  53. javax.accessibility   
  54. javax.activation   
  55. javax.activity   
  56. javax.annotation   
  57. javax.annotation.processing   
  58. javax.crypto   
  59. javax.crypto.interfaces   
  60. javax.crypto.spec   
  61. javax.imageio   
  62. javax.imageio.event   
  63. javax.imageio.metadata   
  64. javax.imageio.plugins.bmp   
  65. javax.imageio.plugins.jpeg   
  66. javax.imageio.spi   
  67. javax.imageio.stream   
  68. javax.jws   
  69. javax.jws.soap   
  70. javax.lang.model   
  71. javax.lang.model.element   
  72. javax.lang.model.type   
  73. javax.lang.model.util   
  74. javax.management   
  75. javax.management.loading   
  76. javax.management.modelmbean   
  77. javax.management.monitor   
  78. javax.management.openmbean   
  79. javax.management.relation   
  80. javax.management.remote   
  81. javax.management.remote.rmi   
  82. javax.management.timer   
  83. javax.naming   
  84. javax.naming.directory   
  85. javax.naming.event   
  86. javax.naming.ldap   
  87. javax.naming.spi   
  88. javax.net   
  89. javax.net.ssl   
  90. javax.print   
  91. javax.print.attribute   
  92. javax.print.attribute.standard   
  93. javax.print.event   
  94. javax.rmi   
  95. javax.rmi.CORBA   
  96. javax.rmi.ssl   
  97. javax.script   
  98. javax.security.auth   
  99. javax.security.auth.callback   
  100. javax.security.auth.kerberos   
  101. javax.security.auth.login   
  102. javax.security.auth.spi   
  103. javax.security.auth.x500   
  104. javax.security.cert   
  105. javax.security.sasl   
  106. javax.sound.midi   
  107. javax.sound.midi.spi   
  108. javax.sound.sampled   
  109. javax.sound.sampled.spi   
  110. javax.sql   
  111. javax.sql.rowset   
  112. javax.sql.rowset.serial   
  113. javax.sql.rowset.spi   
  114. javax.swing   
  115. javax.swing.border   
  116. javax.swing.colorchooser   
  117. javax.swing.event   
  118. javax.swing.filechooser   
  119. javax.swing.plaf   
  120. javax.swing.plaf.basic   
  121. javax.swing.plaf.metal   
  122. javax.swing.plaf.multi   
  123. javax.swing.plaf.synth   
  124. javax.swing.table   
  125. javax.swing.text   
  126. javax.swing.text.html   
  127. javax.swing.text.html.parser   
  128. javax.swing.text.rtf   
  129. javax.swing.tree   
  130. javax.swing.undo   
  131. javax.tools   
  132. javax.transaction   
  133. javax.transaction.xa   
  134. javax.xml   
  135. javax.xml.bind   
  136. javax.xml.bind.annotation   
  137. javax.xml.bind.annotation.adapters   
  138. javax.xml.bind.attachment   
  139. javax.xml.bind.helpers   
  140. javax.xml.bind.util   
  141. javax.xml.crypto   
  142. javax.xml.crypto.dom   
  143. javax.xml.crypto.dsig   
  144. javax.xml.crypto.dsig.dom   
  145. javax.xml.crypto.dsig.keyinfo   
  146. javax.xml.crypto.dsig.spec   
  147. javax.xml.datatype   
  148. javax.xml.namespace   
  149. javax.xml.parsers   
  150. javax.xml.soap   
  151. javax.xml.stream   
  152. javax.xml.stream.events   
  153. javax.xml.stream.util   
  154. javax.xml.transform   
  155. javax.xml.transform.dom   
  156. javax.xml.transform.sax   
  157. javax.xml.transform.stax   
  158. javax.xml.transform.stream   
  159. javax.xml.validation   
  160. javax.xml.ws   
  161. javax.xml.ws.handler   
  162. javax.xml.ws.handler.soap   
  163. javax.xml.ws.http   
  164. javax.xml.ws.soap   
  165. javax.xml.ws.spi   
  166. javax.xml.ws.wsaddressing   
  167. javax.xml.xpath   
  168. org.ietf.jgss   
  169. org.omg.CORBA   
  170. org.omg.CORBA_2_3   
  171. org.omg.CORBA_2_3.portable   
  172. org.omg.CORBA.DynAnyPackage   
  173. org.omg.CORBA.ORBPackage   
  174. org.omg.CORBA.portable   
  175. org.omg.CORBA.TypeCodePackage   
  176. org.omg.CosNaming   
  177. org.omg.CosNaming.NamingContextExtPackage   
  178. org.omg.CosNaming.NamingContextPackage   
  179. org.omg.Dynamic   
  180. org.omg.DynamicAny   
  181. org.omg.DynamicAny.DynAnyFactoryPackage   
  182. org.omg.DynamicAny.DynAnyPackage   
  183. org.omg.IOP   
  184. org.omg.IOP.CodecFactoryPackage   
  185. org.omg.IOP.CodecPackage   
  186. org.omg.Messaging   
  187. org.omg.PortableInterceptor   
  188. org.omg.PortableInterceptor.ORBInitInfoPackage   
  189. org.omg.PortableServer   
  190. org.omg.PortableServer.CurrentPackage   
  191. org.omg.PortableServer.POAManagerPackage   
  192. org.omg.PortableServer.POAPackage   
  193. org.omg.PortableServer.portable   
  194. org.omg.PortableServer.ServantLocatorPackage   
  195. org.omg.SendingContext   
  196. org.omg.stub.java.rmi   
  197. org.w3c.dom   
  198. org.w3c.dom.bootstrap   
  199. org.w3c.dom.events   
  200. org.w3c.dom.ls   
  201. org.xml.sax   
  202. org.xml.sax.ext   
  203. org.xml.sax.helpers  

  怎么样?是不是被吓到了?这么多包,而且还这么多陌生的包名,有的连见都没见过,这特么怎么玩?

  不要着急,LZ先带你把这些包给分下级别,LZ将这些包一共分为四个级别。

 

  第一级别:精读源码

  该级别包含的包如下:

[java] view plain copy
  1. java.io  
  2. java.lang  
  3. java.util  

  精读源码,这是要求最高的级别。但是,要求你精读源码并不意味着,这些类就是最重要的。而是因为,LZ觉得这些类比较常用,而且比较简单,看看它们的源码有助于锻炼你看源码的感觉,也了解一下大神们写代码的风格。

  看这些源码的目的,更多是为了增加你的阅读代码能力。而且,LZ这里必须要强调一下,像Exception和Error这一类的,就不用读源码了,亲。

  其实上面三个包都有一个共同点,那就是这三个包,基本上都是你最常用的了。lang包不用说了,你随便写点啥都得用到,io包和util包也是你平时读写文件和使用数据结构必不可少的。

  看源码从这些常用的包下手找手感,LZ个人觉得再合适不过。

 

  第二级别:深刻理解

  该级别包含的包如下:

[java] view plain copy
  1. java.lang.reflect  
  2. java.net  
  3. javax.net.*  
  4. java.nio.*  
  5. java.util.concurrent.*  

  深刻理解,这个看似比精读源码要求低的级别,其实恰恰是最重要的。这个级别要求的类,全都是一些进阶到高级所必须了解的。

  当然了,这里要强调一点的是,LZ说这些类要深刻理解,而没说要看它们源码,并不是说这些类的源码不能看,或者看了没用。而是这些类的源码往往非常复杂,要了解清楚细节花费的时间是非常多的,因此,花费巨量的时间去研究这么复杂的代码其实没必要的。

  不过,如果你在使用这些类的过程中,遇到了问题,这个时候如果看它们源码可以解决的话,那就不要再矜持了,果断看看源码解决你的问题吧,这是最适合的看源码的契机了。

  小小的透露一下,LZ看过的JDK源码,基本上全是这么看过来的。遇到了问题不要百度和谷歌,看源码能解决你90%的问题。

  此外,看到这四个包的名字,不难看出它们各自代表了什么。reflect代表了反射,net代表了网络IO,nio代表了非阻塞io,concurrent代表了并发。

  这四个家伙可以说每一个都够面试官问上半天的,而且,这四个包的内容,如果你要深刻理解的话,其实还牵扯了很多其它的知识。

  举个例子,反射你要了解清楚的话,你是不是要搞明白JVM的类加载机制?网络IO要搞清楚的话,你是不是要清楚TCP/IP和HTTP、HTTPS?包括并发包,如果你要搞清楚的话,是不是要了解并发的相关知识?

  因此,这四个包要彻底搞清楚,还是需要花费一定时间和精力的。

  但是,请相信LZ,这绝对是值得的,甚至可以说,这四个包用的够不够叼,基本决定了一个Java程序员所处的档次。

  

  第三级别:会用即可

  该级别包含的包如下:

[java] view plain copy
  1. java.lang.annotation  
  2. javax.annotation.*  
  3. java.lang.ref  
  4. java.math  
  5. java.rmi.*  
  6. javax.rmi.*  
  7. java.security.*  
  8. javax.security.*  
  9. java.sql  
  10. javax.sql.*  
  11. javax.transaction.*  
  12. java.text  
  13. javax.xml.*  
  14. org.w3c.dom.*  
  15. org.xml.sax.*  
  16. javax.crypto.*  
  17. javax.imageio.*  
  18. javax.jws.*  
  19. java.util.jar  
  20. java.util.logging  
  21. java.util.prefs  
  22. java.util.regex  
  23. java.util.zip  

  会用即可,这个级别的要求很显然了,就是会用就可以了。这些包大部分都是在特定的情况下会用到,但却不会时刻用到。

  就像sql包和transaction包,就是操作数据库时用到的。而xml、dom和sax这些,都是操作xml时用到的。其它的包也都是类似的,有使用注解时用的,有远程方法调用时用的,也有涉及到加密时用到的等等。

  这些包在面试时一般不会问到,所以它们的重要性自然要低很多,而且也不太需要刻意的去学,用到了研究一下,会用即可。

  

  第四级别:请无视它

  该级别包含了所有以上没有提到的包。

  这个级别就更不用解释了,到现在还没提到的包,基本上可以忽略,因为你基本上不太可能用到它们,比如swing、awt这些玩意儿。

  什么?你说你经常用它们?

  如果真的是这样的话,那么LZ只能遗憾的告诉你,赶紧跳槽吧,你待在这公司没啥前途的,0-0。

  

  第三部分:Java的开发工具

  这些开发工具主要就是辅助你开发的了,javac应该是最常用的一个了,虽然你几乎不用手动执行它。

  此外,其实还有一些比较实用的工具,可以帮助你排查问题。而且有的面试官,也会问你这类问题,比如问你平时都用什么工具排查问题。

  LZ觉得比较实用的几个工具主要有jmap、jconsole、jstack、jvisualvm,至于这几个工具有什么作用,LZ这里就不提了,如果你要了解这些命令的详细内容,可以去谷歌或者官网上找,还是非常好找的。

  当然,如果你有兴趣的话,也可以自己去JDK的bin目录下找找,看有没有什么更好玩的工具。