Java學習路線圖


Java是一個通用的編程語言荒澡,其實可以干很多事橡淆,怎么學Java就看怎么用了,但有一些一般的步驟:

  • 熟悉一種文本編輯器父虑,比如Vim, Emacs, Notepad++, TextMate等该酗。知道哪些是開源的,哪些是閉源的频轿,哪些要收費垂涯。養(yǎng)成不用盜版軟件的習慣。

  • 安裝JDK(建議用你的Linux發(fā)行版自帶的軟件包管理器安裝openjdk航邢,過程中可能需要讀發(fā)行版特定的文檔)

  • 寫一個Java的Helloworld程序,并用命令行工具javac編譯骄蝇,再用java命令運行這個程序膳殷。過程中熟悉源代碼、字節(jié)碼、虛擬機這些東西赚窃,以及Java的包(package)對.class文件所在的路徑的影響册招。如果這兩個命令行工具使用熟練了,可以開始選一個喜歡的集成開發(fā)環(huán)境勒极,比如Eclipse是掰。當然,養(yǎng)成不用盜版軟件的習慣辱匿。熟悉一下如何建立“工程”键痛,以及快捷鍵的使用。

  • 學習Java的面向過程編程匾七,包括基本數據結構絮短、表達式、語句昨忆、控制流丁频、函數調用。

  • 學習Java的面向對象編程邑贴,包括類席里、引用類型和值類型的區(qū)別、成員拢驾、方法胁勺、訪問控制、繼承独旷、多態(tài)署穗、接口、接口實現(xiàn)嵌洼。順便學習一下面向對象的基本思想案疲,即對象、消息麻养、封裝褐啡、繼承、多態(tài)等鳖昌,這些通用的內容不是Java特有的备畦。這時候應該已經涉及了Java的垃圾回收。要留意即使有垃圾回收的情況下也會發(fā)生的內存泄露(如自己設計數組容器许昨,元素是引用懂盐,邏輯上刪除了元素,但并沒有清成null)糕档。注意垃圾回收只能回收內存中的對象莉恼,除了內存以外,其它資源不能依靠垃圾回收來關閉。比如俐银,文件尿背、管道、Socket捶惜、數據庫連接等田藐,垃圾回收是不會幫你關閉的。

  • 學習Java的異常處理吱七,但更重要的是學習什么時候用特殊返回值而不使用異常汽久,什么時候應該拋出異常而不處理異常,知道什么是pokemon catch及其危害陪捷,了解為什么Java的checked exception是一個糟糕的特性回窘。如果愿意,同時學習一下Java1.7的try-with-resource語句和AutoCloseable接口市袖。

  • 熟悉Java常用的數據結構啡直,如基本的數組類型,以及泛型容器(java.util.*)苍碟,尤其是java.util.List接口和java.util.ArrayList實現(xiàn)酒觅;以及java.util.Map接口和java.util.HashMap實現(xiàn)。(java1.5以前的沒有泛型參數的就不用碰了)同時留意一下基本類型int, double等和裝箱類型Integer和Double的區(qū)別微峰,以及它們是如何自動轉換的舷丹。

  • 熟悉Java標準庫里的各種工具,包括日期時間蜓肆、字符串格式化颜凯、IO等。**知道文件要自己在finally子句中close()仗扬,或者用Java1.7的try-with-resource症概,不要妄想垃圾回收器會幫你關掉文件。

  • 學習一下Java的命名習慣早芭,以及JavaBeans的常規(guī)彼城,知道為什么getter/setter比直接操作成員變量好。按這種方式給Java的變量退个、方法命名募壕。同時看看你的IDE能不能自動幫你生成getter和setter。

  • 使用一個第三方的庫(比如Apache Commons Lang通用工具庫)语盈,讓你的程序依賴于它的二進制jar包(而不是直接拷貝源代碼)舱馅,用命令行編譯、運行(注意classpath等)黎烈;也熟悉一下如何用你的集成開發(fā)環(huán)境添加第三方依賴习柠。感受一下手動管理依賴關系的麻煩匀谣。

  • 學習Maven的使用照棋,試著讓Maven幫你解決依賴關系资溃,再試著讓Maven幫你創(chuàng)建一個Eclipse工程。再試試用Maven打包發(fā)布烈炭。

  • 學習軟件測試溶锭,以及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. 調試和輔助工具

學習一下你的集成開發(fā)環(huán)境提供的調試工具,加一些斷點試試蹂风。

  • 試試用jconsole或者VisualVM監(jiān)控另一個jvm的狀態(tài)卢厂。
  • 用profiling工具尋找程序中慢的地方。Eclipse有profiling工具惠啄。VisualVM也有這樣的功能慎恒。(如果不介意使用閉源軟件的話任内,也試試JProfiler和YourKit)
  • 有的JVM允許在運行時更新代碼。Eclipse可以和某些JVM集成融柬。這樣你可以頻繁修改代碼而不用頻繁重啟JVM死嗦。對于某些“重型”工程很有用。(如果不介意使用閉源軟件的話粒氧,也試試jRebel)
  1. 多線程

學習Java的多線程編程以及l(fā)ock越除、condition的用法(包括傳統(tǒng)Java的synchronized語句以及新加的java.util.concurrent.*),學習一下如何讓線程停下來外盯,以及為什么要頻繁確認isInterrupted()而不要用Thread.stop()摘盆。了解一下多核處理器、緩存饱苟、內存的關系街夭,以及為什么多線程編程這么難烫饼。

  • 如果還舒服,學習一下Runnable的用法,以及自帶的Executer等基本多線程工具啃憎。
  • 應該已經留意到java.util里面的很多容器不是線程安全的偷溺,但是java.util.Collections可以幫你創(chuàng)建一些安全的版本划煮。另外關注一下java.util.concurrent里面有ConcurrentMap等容器可供使用裆操。
  • 如果有空的話,看看memory model(內存一致性模型)和無鎖同步(見java memory model和java.util.concurrent.atomic)酿傍。
  • 如果還有空烙懦,再了解一下除了“共享內存多線程編程”以外有沒有別的模型(多進程multi-processing、消息傳遞message passing等)赤炒。
  1. 反射氯析、元編程

    • 學習Java的反射機制,以及Annotation的用法莺褒。
    • 如果還舒服掩缓,試試java.lang.reflect.Proxy的用法。
    • 如果仍然還舒服遵岩,玩一玩CGLib(一個第三方的庫)你辣。
  2. 網絡編程

學習一下IP,TCP協(xié)議(計算機專業(yè)的應該學過尘执,復習一下)舍哄,學習Socket編程(注意垃圾回收器不會幫你關掉Socket)。

  • 如果不是很關心HTTP誊锭,看看java.nio表悬,學習單線程輪詢式IO復用(Selector)。
    1. 如果有點不明白nio的意圖的話丧靡,了解一下c10k問題蟆沫。 http://www.kegel.com/c10k.html
    2. 如果身體沒有異樣的話籽暇,大概了解一下操作系統(tǒng)(包括C語言)提供的select, poll, epoll, kqueue等接口。
    3. 如果身體仍然沒有異樣的話饭庞,試著用java.nio寫一個文件服務器戒悠。
    4. 如果還有精力的話,上網扒一扒有沒有其他的通信庫但绕,如netty等救崔。
  • 如果關心Web還有HTTP惶看,就學習一下HTTP協(xié)議捏顺,以及用Java進行HTTP的客戶端編程。
    1. 如果還舒服纬黎,學學HTML幅骄,寫寫HTML的靜態(tài)網頁(不需要Java)
    2. 如果還舒服,用Java寫一個基于DOM本今、XPath或者CSS Selector的網頁解析器(爬網頁)拆座。
    3. 如果還舒服,學學Java的Servlet接口(先別學jsp)進行Web服務器端編程冠息。學學標準的Servlet容器怎么用挪凑,包括web.xml的用法以及l(fā)istener、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用的好用的東西橄妆。
  1. 數據庫

學習一下關系數據庫(計算機專業(yè)的應該學過衙伶,復習一下),包括SQL害碾。選一個數據庫管理系統(tǒng)熟悉一下(比如MariaDB矢劲,或者(如果你不討厭Oracle的話)用被Oracle收購了的MySQL。先脫離Java單獨學學)慌随。然后看它們的官方文檔教你怎么用Java連接這種數據庫芬沉。這中間會涉及到JDBC接口。同時一定要知道SQL注入安全漏洞阁猜,以及掌握如何用PreparedStatement防止注入M枰荨!剃袍。建議看 http://bobby-tables.com/

  • 可能中間會涉及“事務”問題黄刚,讓你不知不覺地開始去了解java transaction api(JTA)。
  • 如果還舒服民效,學一學對象關系轉換(如Hibernate)憔维。
  • 也可以學學非關系數據庫,以及如何用Java訪問它們畏邢。
  1. 日志記錄

學習一下slf4j和logback的用法业扒。

  • 如果有精力的話,大概了解一下世界上有多少種Java日志框架舒萎,以及slf4j是怎么橋接這些框架的程储。
  1. 構建(build)系統(tǒng)

學習一下Ant的用法。

  • 如果還舒服的話逆甜,學習一下用Ivy從Maven的倉庫里下載軟件包虱肄,解決依賴關系。
  1. 版本控制

學習一種分布式版本控制器(如Git交煞、Mercurial咏窿、Bzr、Darcs等素征,推薦Git)的基本用法集嵌,以及如何用它管理Java工程。希望你已經開始使用Maven了御毅,并且知道為什么把IDE生成的工程文件(如eclipse的.project根欧,.classpath和.metadata)放入版本控制器不好。然后了解一下如何在IDE中使用版本控制(Eclipse自帶Git插件)端蛆。

  • 如果感覺很舒服的話凤粗,為你們實驗室搭建一個Linux+SSH+Git服務器,裝個GitLab(一種Web界面)今豆。
  • 了解“集中式版本控制器”和“分布式版本控制器”的區(qū)別嫌拣,并說服同事們不要再用SVN柔袁、CVS或者SourceSafe等老舊的“集中式版本控制器”了。
  • 開設一個GitHub賬戶异逐。如果你不喜歡Git捶索,就用BitBucket等。
  1. 持續(xù)集成

自己(或者為你們實驗室)搭建一個持續(xù)集成(Continuous Integration)服務器灰瞻,如Jenkins腥例,定期編譯你的程序。建議同時使用Git等分布式版本控制器酝润。

  • 如果你做開源軟件燎竖,試試GitHub和Travis。
  1. 零碎工具

淘一淘java.nio.files里面有什么好用的東東袍祖,然后再淘一淘Apache Commons Lang和Commons IO里有什么好用的工具底瓣。Commons Logging就不要再用了,用SLF4j和Logback蕉陋。

  1. XML

學學XML、DOM拨扶、XPath凳鬓。XML這東西到處都可能用到。也可以用它寫自己的配置文件患民。

  • 如果覺得不舒服了缩举,就學學JSON和YAML。
  • 如果還是不舒服匹颤,就學學文本文件解析仅孩。
  1. 語法分析和編譯器

學學Antlr或者別的Parser Generator的用法

  • 如果覺得舒服,自己寫一個計算器印蓖。
  • 如果還覺得舒服辽慕,自己寫一種Domain-Specific Language (DSL)。
  1. 高效容器

學學FastUtil或者Trove赦肃,如果你需要進行大量數值運算的話溅蛉。

  1. 分布式計算

學學MapReduce的思想以及它的實現(xiàn)。

  • 如果還舒服他宛,學學Scala語言以及號稱比MapReduce快得多的Apache Spark船侧。
  1. 進程間通信

看看ActiveMQ、MINA和RMI厅各。

  1. 其他語言(JVM)

學習另一門跑在JVM上的語言或者實現(xiàn)(如Groovy镜撩、Scala、Clojure队塘、JRuby袁梗、Jython卫旱、JavaScript……)

  1. 其他語言(非JVM)

學習另一門通用腳本語言(如Python奈泪、Ruby适贸,其實perl也行,但不推薦)涝桅,知道什么時候Java不是最好的選擇拜姿。

  1. Java語言和Java虛擬機

通讀一遍(一目十行地讀,不用細讀)Java Language Specification冯遂,以及Java Virtual Machine Specification蕊肥。

  • 了解以下解釋器(interpreter)、編譯器(compiler)蛤肌、即時編譯器(just-in-time compiler)和優(yōu)化器(optimiser)的概念壁却。
  • 如果對編譯器的話題不感到畏懼,了解一下method JIT和tracing JIT的概念和區(qū)別裸准。
  1. 內存管理

學學垃圾回收的幾種基本算法展东,包括mark-sweep、mark-compact炒俱、semi-space盐肃、generational、mark-region等权悟,各自的性能砸王,以及為什么樸素的reference counting是不完整的。知道為什么finalizer性能很糟糕峦阁,而且標準并不要求finalizer在程序退出前一定會執(zhí)行谦铃。

  • 如果還舒服,了解一下如何設置Java虛擬機的堆大小限制(如HotSpot虛擬機的-Xmx選項等)拇派。
  • 了解一下Java里的WeakReference以及SoftReference和PhantomReference荷辕,以及它們什么時候有用,以及為什么它們實現(xiàn)起來有些困難件豌。
  • 如果有精力疮方,了解一下Hotspot虛擬機的內存管理算法是什么樣的。
  1. 動態(tài)裝載

學學Java的動態(tài)裝載(class loading)

  • 如果還舒服的話茧彤,學學OSGI以及它的一種實現(xiàn)(如Felix或者Equinox)
  • 如果仍然很舒服的話骡显,學學寫基于Eclipse平臺的程序。不是Eclipse集成開發(fā)環(huán)境,只是利用他們的圖形框架惫谤,寫自己的應用程序壁顶。
  • 如果還覺得舒服的話,寫Eclipse集成開發(fā)環(huán)境的插件溜歪。
  1. 本地/外語接口

學習一下Java Native Interface(JNI)若专,試著寫一個Java和C語言混合編程的程序。

  • 如果覺得不舒服了或者覺得欲仙欲死蝴猪,就學一學Java Native Access(JNA)调衰,試一試不用任何膠水代碼而從Java直接裝載C庫,直接調用C函數自阱。
  • 如果連JNA也懶得學嚎莉,就學一學SWIG,自動生成綁定沛豌。
  • 如果覺得舒服趋箩,就學一學Java Virtual Machine Tooling Interface(JVMTI),用C程序來監(jiān)視JVM的狀態(tài)加派。
  1. 密碼學

學一學密碼學叫确,包括編碼、密碼分析哼丈、攻擊启妹、對稱密鑰、公鑰系統(tǒng)醉旦、數字簽名、哈希算法等桨啃,看看Java有沒有實現(xiàn)车胡。

  • 如果覺得有點不舒服(你應該不會覺得舒服吧,除非你是學密碼學的照瘾,要不然總會覺得自己寫的程序有安全漏洞)匈棘,就寫一個“人品計算器”來放松一下,要求每次輸入同一個姓名析命,得到的人品值是固定的主卫,但又要讓人無法用別人的人品值猜自己的人品值。
  1. 移動終端

學一學Android開發(fā)鹃愤。

  • 如果有精力的話簇搅,看看Dalvik虛擬機是怎么回事。
  • 建議買一個iPhone或者iPad软吐,或許你再也不想用Android手機或者平板了瘩将。
  1. 歷史

如果覺得有些無聊,就去挖一挖歷史上比較火的可能和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的作者本人為什么又開發(fā)了SLF4j和Logback喧兄?
  • Java最早是為什么設計的?
  • Type erasure是怎么回事啊楚?為什么ArrayList<int>不行但ArrayList<Integer>就可以吠冤?挖一挖歷史。

其實Java不算完全面向對象的語言恭理。Java更偏實用性拯辙,很多控制流(if語句、while循環(huán)颜价、for循環(huán)等)來自面向過程的語言涯保;基本數據類型(int, char, double等)也不是對象。但另一些語言周伦,比如SmallTalk夕春,更偏向純粹的面向對象的設計,包括基本的數據類型都是對象横辆,if/while/for等也用對象和方法來實現(xiàn)撇他。比如:

基本數據類型也是對象茄猫,可以接受消息(即方法),比如:

(a + b) sqrt

這里面困肩,a+b其實是向a發(fā)送“+”消息划纽,參數是b。sqrt也是一個消息锌畸,發(fā)給一個數勇劣。

if分支是這樣做的:

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

ifTrue:ifFalse: 是一個Boolean對象的一個方法,取兩個參數潭枣,每個是一個“塊”比默,分別在真和假的情況下執(zhí)行。

還有while循環(huán)是這樣做的:

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

whileTrue是“塊”的一個方法盆犁,每次對塊求值命咐,如果是真,就反復執(zhí)行第一個參數(也是“塊”)谐岁。

所以醋奠,相對其他面向對象的語言,Java并不算很“面向對象”伊佃。所以需要補充一些對面向對象語言的了解窜司。



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市航揉,隨后出現(xiàn)的幾起案子塞祈,更是在濱河造成了極大的恐慌,老刑警劉巖帅涂,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件议薪,死亡現(xiàn)場離奇詭異,居然都是意外死亡媳友,警方通過查閱死者的電腦和手機笙蒙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庆锦,“玉大人,你說我怎么就攤上這事轧葛÷悖” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵尿扯,是天一觀的道長求晶。 經常有香客問我,道長衷笋,這世上最難降的妖魔是什么芳杏? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上爵赵,老公的妹妹穿的比我還像新娘吝秕。我一直安慰自己,他們只是感情好空幻,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布烁峭。 她就那樣靜靜地躺著,像睡著了一般秕铛。 火紅的嫁衣襯著肌膚如雪约郁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天但两,我揣著相機與錄音鬓梅,去河邊找鬼。 笑死谨湘,一個胖子當著我的面吹牛绽快,可吹牛的內容都是我干的。 我是一名探鬼主播悲关,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谎僻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寓辱?” 一聲冷哼從身側響起艘绍,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秫筏,沒想到半個月后诱鞠,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡这敬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年航夺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崔涂。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳掐,死狀恐怖,靈堂內的尸體忽然破棺而出冷蚂,到底是詐尸還是另有隱情缭保,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布蝙茶,位于F島的核電站艺骂,受9級特大地震影響,放射性物質發(fā)生泄漏隆夯。R本人自食惡果不足惜钳恕,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一别伏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忧额,春花似錦厘肮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抡砂,卻和暖如春大咱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背注益。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工碴巾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丑搔。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓厦瓢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啤月。 傳聞我的和親對象是個殘疾皇子煮仇,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容