如何作到招聘要求中的「要有扎实的 Java 基础」

#引言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吧。
相关文章
相关标签/搜索