Java学习路线
【以下肯定是不完整的列表,欢迎补充】
【好像还缺什么:缓存技术。欢迎补充】
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了。
但有一些一般的步骤:
1. 熟悉一种文本编辑器,比如Vim, Emacs, Notepad++, TextMate等。知道哪些是开源的,哪些是闭源的,哪些要收费。养成不用盗版软件的习惯。
2. 安装JDK(建议用你的Linux发行版自带的软件包管理器安装openjdk,过程中可能需要读发行版特定的文档)
3. 写一个Java的Hello world程序,并用命令行工具javac编译,再用java命令运行这个程序。过程中熟悉源代码、字节码、虚拟机这些东西,以及Java的包(package)对.class文件所在的路径的影响。
3.5. 如果这两个命令行工具使用熟练了,可以开始选一个喜欢的集成开发环境,比如Eclipse。当然,养成不用盗版软件的习惯。熟悉一下如何建立“工程”,以及快捷键的使用。
4. 学习Java的面向过程编程,包括基本数据结构、表达式、语句、控制流、函数调用。
5. 学习Java的面向对象编程,包括类、修饰符、引用类型和值类型的区别、成员、方法、访问控制、继承、多态、接口、接口实现。顺便学习一下面向对象的基本思想,即对象、消息、封装、继承、多态等,这些通用的内容不是Java特有的。
5.5 这时候应该已经涉及了Java的垃圾回收。要留意即使有垃圾回收的情况下也会发生的内存泄露(如自己设计数组容器,元素是引用,逻辑上删除了元素,但并没有清成null)。注意垃圾回收只能回收内存中的对象,除了内存以外,其它资源不能依靠垃圾回收来关闭。比如,文件、管道、Socket、数据库连接等,垃圾回收是不会帮你关闭的。
6. 学习Java的异常处理,但更重要的是学习什么时候用特殊返回值而不使用异常,什么时候应该抛出异常而不处理异常,知道什么是pokemon catch及其危害,了解为什么Java的checked exception是一个糟糕的特性。如果愿意,同时学习一下Java1.7的try-with-resource语句和AutoCloseable接口。
7. 熟悉Java常用的数据结构,如基本的数组类型,以及泛型容器(java.util.*),尤其是java.util.List<T>接口和java.util.ArrayList<T>实现;以及java.util.Map<T,U>接口和java.util.HashMap<T,U>实现。(java1.5以前的没有泛型参数的就不用碰了)同时留意一下基本类型int, double等和装箱类型Integer和Double的区别,以及它们是如何自动转换的。
8. 熟悉Java标准库里的各种工具,包括日期时间、字符串格式化、IO等。知道文件要自己在finally子句中close(),或者用Java1.7的try-with-resource,不要妄想垃圾回收器会帮你关掉文件。
9. 学习一下Java的命名习惯,以及JavaBeans的常规,知道为什么getter/setter比直接操作成员变量好。按这种方式给Java的变量、方法命名。同时看看你的IDE能不能自动帮你生成getter和setter。
10. 使用一个第三方的库(比如Apache Commons Lang通用工具库),让你的程序依赖于它的二进制jar包(而不是直接拷贝源代码),用命令行编译、运行(注意classpath等);也熟悉一下如何用你的集成开发环境添加第三方依赖。感受一下手动管理依赖关系的麻烦。
11. 学习Maven的使用,试着让Maven帮你解决依赖关系,再试着让Maven帮你创建一个Eclipse工程。再试试用Maven打包发布。
12. 学习软件测试,以及JUnit的使用,以及怎么在IDE中使用JUnit。有空看一下coverage工具。
13. 读读四人帮写的《设计模式》(这本书是用C++和Smalltalk语言为例子的,但仍然适合Java)。具体的是这本书, http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612 图书馆应该能还借到英文原版,因为我借到过。
接下来就看具体要做哪方面的应用了,看需求。比如(下面的没有顺序)
【....】如果学Java学得不舒服了,学Python。
* 如果对面向对象编程的概念有点不习惯,学Smalltalk。(Ruby也行,但不如Smalltalk经典。Ruby的文档是一大硬伤。)
* 如果嫌Java太啰嗦,学Python
* 如果嫌Java太啰嗦,又想用JVM,自己又有精力,学Scala
* 如果对对象之间的关系有点晕,学一学UML,以及它的一些图,可以对程序和运行进行直观的建模。你的IDE也许有插件可以生成UML图。但是不要太沉迷于这些方法论。
【调试和辅助工具】学习一下你的集成开发环境提供的调试工具,加一些断点试试
* 试试用jconsole或者VisualVM监控另一个jvm的状态。
* 用profiling工具寻找程序中慢的地方。Eclipse有profiling工具。VisualVM也有这样的功能。(如果不介意使用闭源软件的话,也试试JProfiler和YourKit)
* 有的JVM允许在运行时更新代码。Eclipse可以和某些JVM集成。这样你可以频繁修改代码而不用频繁重启JVM。对于某些“重型”工程很有用。(如果不介意使用闭源软件的话,也试试jRebel)
【多线程】先读Oracle的Java Tutorial里的这一章,请自始至终关注“happens-before“这个词,学完以后应该可以写出正确的并发程序了。
* 抽空顺便了解一下多核处理器、缓存、内存的关系,以及CPU内部的内存读写指令的重排序等细节,体会一下为什么多线程编程这么难。
* 学习Java的多线程编程接口,主要是lock、condition的用法
* Java里每个对象都可以用synchronized语句同步,有wait, notify方法,但这套机制有缺陷。
* 看看java.util.concurrent.lock里的Lock和Condition接口,看它们是怎么解决这些缺陷的。
* 学完之后,学学用Future和Promise来同步,而不是手动用lock和condition。
* 还有semaphore、cyclic barrier、count-down latch、phaser等高级同步工具,或许可以少重新发明一些轮子。
* 还有BlockingQueue
* 学习一下如何让线程停下来,以及为什么要频繁确认isInterrupted()而不要用Thread.stop()(看Java API里Thread.stop()的文档)。
* 如果还舒服,学习一下用Runnable来封装“任务”而不是“线程”,并用Java自带的ThreadPoolExecuter、ForkJoinPool等工具帮你管理线程。
* 应该已经留意到java.util里面的很多容器不是线程安全的,但是java.util.Collections可以帮你创建一些安全的版本。另外关注一下java.util.concurrent里面有ConcurrentMap等容器可供使用。
* 如果有空的话,看看memory model(内存一致性模型)和无锁同步(见java memory model和java.util.concurrent.atomic)。
* 如果还有空,再了解一下除了“共享内存多线程编程”以外有没有别的模型(多进程multi-processing、消息传递message passing等)。或许这时候你已经爱上BlockingQueue了。
【反射、元编程】学习Java的反射机制,以及Annotation的用法。
* 如果还舒服,试试java.lang.reflect.Proxy的用法。
* 如果仍然还舒服,玩一玩CGLib(一个第三方的库)。
【网络编程】学习一下IP, TCP协议(计算机专业的应该学过,复习一下),学习Socket编程(注意垃圾回收器不会帮你关掉Socket)。
1. 如果不是很关心HTTP,看看java.nio,学习单线程轮询式IO复用(Selector)。
* 如果有点不明白nio的意图的话,了解一下c10k问题。 http://www.kegel.com/c10k.html
* 如果身体没有异样的话,大概了解一下操作系统(包括C语言)提供的select, poll, epoll, kqueue等接口。
* 如果身体仍然没有异样的话,试着用java.nio写一个文件