Java学习路线图


Java大凡一个通用的编程语言,其实可以提到多从业,怎么学Java就看怎么用了,但生局部形似的步骤:

  • 习一种文本编辑器,比如Vim, Emacs, Notepad++,
    TextMate等。知道如何是开源的,哪些是闭源的,哪些要收费。养成不用盗版软件的习惯。

  • 安装JDK(建议用你的Linux发行本于带的软件包管理器安装openjdk,过程被或许用读发行本特定的文档)

  • 形容一个Java的Helloworld程序,并据此命令行工具javac编译,再就此java命令运行是顺序。过程遭到熟悉源代码、字节码、虚拟机这些东西,以及Java的包(package)对.class文件所在的路子的熏陶。如果这有限只命令行工具使用熟练了,可以开选择一个喜的合开发条件,比如Eclipse。当然,养成不用盗版软件的习惯。熟悉一下怎么树立“工程”,以及快捷键的使用。

  • 学Java的面向过程编程,包括核心数据结构、表达式、语句、控制流、函数调用。

  • 读书Java的面向对象编程,包括类、引用类型及值类型的区别、成员、方法、访问控制、继承、多态、接口、接口实现。顺便学习一下面向对象的基本思维,即对象、消息、封装、继承、多态等,这些通用的始末未是Java特有的。这时候应该早就关系了Java的排泄物回收。要小心就出垃圾堆回收的气象下也会时有发生的内存泄露(如自己计划数组容器,元素是援,逻辑上剔除了元素,但连无清成null)。注意垃圾回收只能回收内存被之靶子,除了内存以外,其他资源不能够靠垃圾回收来关闭。比如,文件、管道、Socket、数据库连接等,垃圾回收是免会见拉扯您关闭的。

  • 学习Java的老大处理,但再次主要的凡上学啊时用不同寻常返回值如果未行使大,什么时候相应抛出异常而不处理非常,知道什么是pokemon
    catch及其危害,了解怎么Java的checked
    exception是一个不好之特性。如果愿意,同时学习一下Java1.7的try-with-resource语句和AutoCloseable接口。

  • 熟识Java常用的数据结构,如基本的数组类型,以及泛型容器(java.util.*),尤其是java.util.List接口和java.util.ArrayList实现;以及java.util.Map接口和java.util.HashMap实现。(java1.5在先的莫泛型参数的便无须点了)同时注意一下基本类型int,
    double等和装箱类型Integer和Double的界别,以及它们是什么样自动转换的。

  • 熟识Java标准库里之各种工具,包括日期时、字符串格式化、IO等。**知晓文书要和谐于finally子句中close(),或者用Java1.7底try-with-resource,不要妄想垃圾回收器会帮你关掉文件。

  • 上一下Java的命名习惯,以及JavaBeans的正常化,知道为何getter/setter比直接操作成员变量好。按这种艺术给Java的变量、方法命名。同时看望你的IDE能不能自动帮您生成getter和setter。

  • 使一个叔正值的库(比如Apache Commons
    Lang通用工具库),让你的先后因让它们的老二上前制jar包(而非是直拷贝源代码),用命令行编译、运行(注意classpath等);也熟识一下如何用你的合一开发条件上加第三正值依。感受一下手动管理依赖关系的劳动。

  • 读Maven的行使,试着被Maven帮您解决因关系,再尝试着叫Maven帮您创造一个Eclipse工程。再尝试用Maven打包发布。

  • 攻软件测试,以及JUnit的下,以及怎么当IDE中行使JUnit。有空看一下coverage工具。

  • 读读四人数帮写的《设计模式》(这本书是故C++和Smalltalk语言为例子的,但仍旧适合Java)。具体的凡随即按照开,http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612图书馆应该能够还借到英文原版,因为自身借到了。


连接下就看具体而举行呀方面的使了,看需求。比如(下面的从未有过各个)

  1. 有关语言

    • 设学Java学得无舒适了,学Python。
    • 苟对面向对象编程的定义有点不习惯,学Smalltalk。(Ruby也实践,但未使Smalltalk经典。Ruby的文档是一样要命钢铁伤。)
    • 如果嫌Java太啰嗦,学Python
    • 一经嫌Java太啰嗦,又想用JVM,自己并且发精力,学Scala
    • 如若对目标中的干有点晕,学一效仿UML,以及它们的有贪图,可以针对程序和运转进行直观的建模。你的IDE也许有插件可以生成UML图。但是不要太沉迷于这些方法论。
  2. 调剂和辅助工具

修一下公的合龙开发环境提供的调剂工具,加有断点试试。

  • 试用jconsole或者VisualVM监控另一个jvm的状态。
  • 因此profiling工具寻找程序中慢的地方。Eclipse有profiling工具。VisualVM也闹这般的作用。(如果非在意使用闭源软件的语句,也跃跃欲试JProfiler和YourKit)
  • 片JVM允许以运作时更新代码。Eclipse可以与少数JVM集成。这样您得频繁修改代码而无用频繁重开JVM。对于某些“重型”工程大有因此。(如果无介意使用闭源软件的口舌,也试试jRebel)

  • 多线程

习Java的多线程编程以及lock、condition的用法(包括传统Java的synchronized语句以及新加底java.util.concurrent.*),学习一下怎么让线程停下来,以及为什么要再三确认isInterrupted()而毫无就此Thread.stop()。了解一下大抵核查处理器、缓存、内存的涉,以及为何多线程编程这么麻烦。

  • 万一还舒服,学习一下Runnable底用法,以及自带的Executer等为主多线程工具。
  • 应当已经注意到java.util里面的众多容器不是线程安全的,但是java.util.Collections可以协助您创造有康宁之本子。另外关注一下java.util.concurrent里面有ConcurrentMap等容器可供使用。
  • 一旦有空的讲话,看看memory model(内存一致性模型)和无锁同步(见java
    memory model和java.util.concurrent.atomic)。
  • 只要还有空,再了解一下除“共享内存多线程编程”以外有无发别的模型(多进程multi-processing、消息传递message
    passing等)。

  • 反射、元编程

    • 学习Java的照机制,以及Annotation的用法。
    • 假如还舒服,试试java.lang.reflect.Proxy的用法。
    • 假定还是还舒服,玩同样打CGLib(一个叔在的库)。
  • 网编程

攻一下IP,TCP协议(计算机专业的该学过,复习一下),学习Socket编程(注意垃圾回收器不见面帮你关掉Socket)。

  • 如未是生关注HTTP,看看java.nio,学习单线程轮询式IO复用(Selector)。
    1. 而生硌不明白nio的意图的说话,了解一下c10k题目。
      http://www.kegel.com/c10k.html
    2. 使人没有突出的话,大概了解一下操作系统(包括C语言)提供的select,
      poll, epoll, kqueue等接口。
    3. 若果身体还是没有非常的话,试着用java.nio写一个文本服务器。
    4. 如若还有生命力的话,上网扒一扒有没有出任何的通信库,如netty等。
  • 倘若关注Web还有HTTP,就上一下HTTP协议,以及用Java进行HTTP的客户端编程。

    1. 假定还舒服,学学HTML,写写HTML的静态网页(不待Java)
    2. 若是还舒服,用Java写一个基于DOM、XPath或者CSS
      Selector的网页解析器(爬网页)。
    3. 若还舒服,学学Java的Servlet接口(先别学jsp)进行Web服务器端编程。学学标准的Servlet容器怎么用,包括web.xml的用法及listener、filter等概念。以及有Servlet容器(如Jetty或者Tomcat)的实际用法。
    4. 一旦仍然还舒服,试着学一种模板语言(如haml, velocity,
      freemarker,【还发生另外还好之框架为?我未明了】,
      String.format,如果确想学JSP的话JSP倒是为行,但未推荐)。
    5. 设若还是觉得舒适,学学Spring框架中的Web框架,或者Struts,看您的气味。
    6. 假设还舒服,看看Spring Bean
      Container以及中各种乱的家伙。
    7. 要是还舒服,或者有要求,了解一下哟是RESTful Web
      Service,复习一下HTTP,找找抱之Java工具。
    8. 您也许会见认为Jackson是一个解析JSON用底好用的事物。
  • 数据库

学习一下关系数据库(计算机专业的当学过,复习一下),包括SQL。选一个数据库管理体系熟悉一下(比如MariaDB,或者(如果您免讨厌Oracle的言语)用让Oracle收购了底MySQL。先脱离Java单独学学)。然后看它们的合法文档教你怎么用Java连接这种数据库。这中会干到JDBC接口。同时早晚要解SQL注入安全漏洞,以及掌握如何用PreparedStatement防止流入!!。建议看
http://bobby-tables.com/

  • 或是当中会干“事务”问题,让您下意识地初步去矣解java transaction
    api(JTA)。
  • 假设还舒服,学一法对象关联转移(如Hibernate)。
  • 否得学学非关系数据库,以及哪些用Java访问它们。

  • 日志记录

修一下slf4j和logback的用法。

  • 万一起活力的话,大概了解一下世界上发出微种Java日志框架,以及slf4j是怎么桥接这些框架的。

  • 构建(build)系统

读一下Ant底用法。

  • 而还舒服的言语,学习一下因此Ivy从Maven的库房里产充斥软件包,解决因关系。

  • 版本控制

学习一种分布式版本控制器(如Git、Mercurial、Bzr、Darcs等,推荐Git)的骨干用法,以及怎样用她管理Java工程。希望您既初步以Maven了,并且亮怎么拿IDE生成的工文件(如eclipse的.project,.classpath和.metadata)放入版本控制器不好。然后了解一下什么样当IDE中采取本控制(Eclipse从带Git插件)。

  • 假使觉得蛮舒服的语,为你们实验室搭建筑一个Linux+SSH+Git服务器,装个GitLab(一种植Web界面)。
  • 刺探“集中式版本控制器”和“分布式版本控制器”的分,并说服同事们毫不还用SVN、CVS或者SourceSafe等始终旧的“集中式版本控制器”了。
  • 设立一个GitHub账户。如果您无爱好Git,就用BitBucket等。

  • 不停集成

投机(或者为你们实验室)搭建筑一个不辍集成(Continuous
Integration)服务器,如Jenkins,定期编译你的次。建议还要使Git等分布式版本控制器。

  • 若果你开始发源软件,试试GitHub和Travis。

  • 零星工具

淘一淘java.nio.files里面有什么好用的东东,然后再淘一淘Apache Commons
Lang和Commons IO里来啊好用的家伙。Commons
Logging就无须再次用了,用SLF4j和Logback。

  1. XML

读书XML、DOM、XPath。XML这东西到处都可能为此到。也可以为此其写自己之配置文件。

  • 若是认为不痛快了,就上JSON和YAML。
  • 比方还是无好受,就上文本文件分析。

  • 语法分析和编译器

学学Antlr或者别的Parser Generator的用法

  • 如认为舒心,自己写一个计算器。
  • 设还觉得舒服,自己写一种Domain-Specific Language (DSL)。

  • 快捷容器

念FastUtil或者Trove,如果你要开展大气数值运算的口舌。

  1. 分布式计算

习MapReduce的思维与它的兑现。

  • 若果还舒服,学学Scala语言以及名为比MapReduce快得几近的Apache Spark。

  • 过程中通信

看看ActiveMQ、MINA和RMI。

  1. 另外语言(JVM)

读书其他一样帮派走在JVM上之言语或实现(如Groovy、Scala、Clojure、JRuby、Jython、JavaScript……)

  • 假设还舒服,学一学Java Scripting
    API(注意勿是JavaScript。给个链接:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer\_guide/
    ),然后试着在大团结之Java程序里搭脚本。

  • 另外语言(非JVM)

学习其他一样门通用脚本语言(如Python、Ruby,其实perl也实施,但不推荐),知道呀时Java不是极度好之选取。

  1. Java语言和Java虚拟机

搭读一满(一目十行地朗诵,不用细读)Java Language
Specification,以及Java Virtual Machine Specification。

  • 问询以下解释器(interpreter)、编译器(compiler)、即时编译器(just-in-time
    compiler)和优化器(optimiser)的定义。
  • 一经对编译器的话题不倍感害怕,了解一下method JIT和tracing
    JIT的概念与区别。

  • 内存管理

学垃圾回收的几乎栽为主算法,包括mark-sweep、mark-compact、semi-space、generational、mark-region等,各自的性质,以及为何朴素的reference
counting是无完的。知道为什么finalizer性能很糟糕,而且专业并无求finalizer在次退出前一定会履。

  • 要是还舒服,了解一下怎么样设置Java虚拟机的堆大小限制(如HotSpot虚拟机的-Xmx选项等)。
  • 叩问一下Java里的WeakReference以及SoftReference和PhantomReference,以及它们啊时发因此,以及为什么它实现起来有点不方便。
  • 设发生生命力,了解一下Hotspot虚拟机的内存管理算法是安的。

  • 动态装载

读书Java的动态装载(class loading)

  • 一旦还舒服的讲话,学学OSGI以及她的均等种实现(如Felix或者Equinox)
  • 如果仍然非常清爽的语,学学写基于Eclipse平台的顺序。不是Eclipse集成开发环境,只是使用他们之图形框架,写自己之应用程序。
  • 倘若还看舒服的话语,写Eclipse集成开发条件的插件。

  • 地面/外语接口

读一下Java Native
Interface(JNI),试着写一个Java和C语言混合编程的次。

  • 倘当无舒适了要当欲仙欲死,就模仿一学Java Native
    Access(JNA),试一跃跃欲试不用别样胶水代码而从Java直接装载C库,直接调用C函数。
  • 如连JNA也懒得学,就照葫芦画瓢一仿SWIG,自动生成绑定。
  • 设认为舒服,就套一学Java Virtual Machine Tooling
    Interface(JVMTI),用C程序来监视JVM的状态。

  • 密码学

宪章一拟密码学,包括编码、密码分析、攻击、对如密钥、公钥系统、数字签名、哈希算法等,看看Java有没来落实。

  • 如若认为小不痛快(你应当不见面以为舒心吧,除非您是仿照密码学的,要不然总会觉得自己写的次来安全漏洞),就形容一个“人品计算器”来放松一下,要求每次输入同一个人名,得到的人头品值是定位的,但以如为人口束手无策用他人的人品值猜自己的口品值。

  • 动终端

学一学Android开发。

  • 倘出活力的话,看看Dalvik虚拟机是怎么回事。
  • 提议购买一个iPhone或者iPad,或许你再为非思就此Android手机或者平板了。

  • 历史

设以为小俗气,就失挖掘一挖历史上比火之恐怕同Java相关技能,比如:

  • Applet,想想她比从html5+css3+javascript的通病在哪里。
  • AWT、Swing,想想怎么很少有人因此Java写图形界面程序。你以为Swing的次看上去舒服啊?中国人同畸形儿喜欢用Swing程序吗?
  • JNDI,想想她比较由Spring Bean Container的欠缺在乌。
  • JSP,想想她比起MVC结构的短处在何。
  • WSDL/SOAP,把它们和XML-RPC、RESTful Web Service比较一下。
  • XSLT,以及为何她是图灵完备的。可是它的确比Java本身又好用呢?
  • Log4j、java.util.logging、Apache Commons
    Logging,各自发生啊问题,以及Log4j的作者自己为什么以出了SLF4j和Logback?
  • Java最早是为什么设计的?
  • Type
    erasure是怎么回事?为什么ArrayList<int>不行但ArrayList<Integer>就可?挖一挖历史。

实际Java不算是了面向对象的语言。Java又偏实用性,很多控制流(if语句、while循环、for循环等)来自面向过程的语言;基本数据类(int,
char,
double等)也未是目标。但其他一部分语言,比如SmallTalk,更偏于纯的面向对象的计划,包括核心的数据类型都是目标,if/while/for等也因此对象同法来贯彻。比如:

核心数据列为是目标,可以接受信息(即方法),比如:

(a + b) sqrt

当时其中,a+b其实是通往a发送“+”消息,参数是b。sqrt也是一个信,发给一个往往。

if分支是这样做的:

(x < y) ifTrue: [ 
       max := y. 
       i := j 
     ] ifFalse: [ 
       max := x. 
       i := k 
     ]

ifTrue:ifFalse:
是一个Boolean对象的一个方,取鲜个参数,每个是一个“块”,分别以真正与假的情状下实行。

还有while循环是这般Oracle做的:

[i < 100] whileTrue: [ 
       sum := sum + i. 
       i := i + 1 
     ]

whileTrue是“块”的一个措施,每次对片求值,如果是真的,就一再实践第一个参数(也是“块”)。

因而,相对其他面向对象的语言,Java并无到底大“面向对象”。所以待上部分针对面向对象语言的问询。


  • 文章转自:北邮论坛

相关文章