史上最強Java學習路線(詳解)

2021-02-19 21CTO

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的常規,知道為什麼gettertter比直接操作成員變量好。按這種方式給Java的變量、方法命名。同時看看你的IDE能不能自動幫你生成getter和setter。


使用一個第三方的庫(比如Apache Commons Lang通用工具庫),讓你的程序依賴於它的二進位jar包(而不是直接拷貝原始碼),用命令行編譯、運行(注意classpath等);也熟悉一下如何用你的集成開發環境添加第三方依賴。感受一下手動管理依賴關係的麻煩。


學習Maven的使用,試著讓Maven幫你解決依賴關係,再試著讓Maven幫你創建一個Eclipse工程。再試試用Maven打包發布。
學習軟體測試,以及JUnit的使用,以及怎麼在IDE中使用JUnit。有空看一下coverage工具。


讀讀四人幫寫的《設計模式》(這本書是用C++和Smalltalk語言為例子的,但仍然適合Java)。 

接下來就看具體要做哪方面的應用了,看需求。比如(下面的沒有順序)

調試和輔助工具

學習一下你的集成開發環境提供的調試工具,加一些斷點試試。

試試用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)。

如果有點不明白nio的意圖的話,了解一下c10k問題。http://www.kegel.com/c10k.html

如果身體沒有異樣的話,大概了解一下作業系統(包括C語言)提供的select, poll, epoll, kqueue等接口。

如果身體仍然沒有異樣的話,試著用java.nio寫一個文件伺服器。

如果還有精力的話,上網扒一扒有沒有其他的通信庫,如netty等。

如果關心Web還有HTTP,就學習一下HTTP協議,以及用Java進行HTTP的客戶端編程。

如果還舒服,學學HTML,寫寫HTML的靜態網頁(不需要Java)

如果還舒服,用Java寫一個基於DOM、XPath或者CSS Selector的網頁解析器(爬網頁)。

如果還舒服,學學Java的Servlet接口(先別學jsp)進行Web伺服器端編程。學學標準的Servlet容器怎麼用,包括web.xml的用法以及listener、filter等概念。以及某個Servlet容器(如Jetty或者Tomcat)的具體用法。

如果仍然還舒服,試著學一種模板語言(如haml, velocity, freemarker,【還有其他更好的框架嗎?我不知道】, String.format,如果真的想學JSP的話JSP倒是也行,但不推薦)。

如果仍然覺得舒服,學學Spring框架中的Web框架,或者Struts,看你的口味。

如果還舒服,看看Spring Bean Container以及裡面各種亂七八糟的工具。

如果還舒服,或者有需求,了解一下什麼是RESTful Web Service,複習一下HTTP,找找適合的Java工具。

你可能會覺得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。

XML

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

如果覺得不舒服了,就學學JSON和YAML。

如果還是不舒服,就學學文本文件解析。

語法分析和編譯器

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

如果覺得舒服,自己寫一個計算器。

如果還覺得舒服,自己寫一種Domain-Specific Language (DSL)。

高效容器

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

分布式計算

學學MapReduce的思想以及它的實現。

如果還舒服,學學Scala語言以及號稱比MapReduce快得多的Apache Spark。

進程間通信

看看ActiveMQ、MINA和RMI。

其他語言(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不是最好的選擇。

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循環是這樣做的:

|[i < 100] whileTrue: [ 

       sum := sum + i. 

       i := i + 1

     ]

whileTrue是「塊」的一個方法,每次對塊求值,如果是真,就反覆執行第一個參數(也是「塊」)。

所以,相對其他面向對象的語言,Java並不算很「面向對象」。所以需要補充一些對面向對象語言的了解。

來源:編譯自網絡

相關焦點

  • 大數據學習路線整理
    客戶端基本操作及事件監聽    zookeeper核心機制及數據節點    zookeeper應用案例–分布式共享資源鎖    zookeeper應用案例–伺服器上下線動態感知    zookeeper的數據一致性原理及leader選舉機制5、java高級特性增強    Java多線程基本知識    Java同步關鍵詞詳解
  • Java後端學習流程
    首先,我個人比較推崇的學習方法是:先學java前端,也就是HTML,css,js,因為學習java以後肯定是往java ee方向發展的,學習完前端
  • Java程式設計師需要學習的五種語言
    Java開發人員要學習的五種語言作為程式設計師,要想探索新事物。學習新的程式語言會為自己解決問題提供更多的視角。那麼,Java開發人員應該探索哪些新語言?學習Java 8/9 +中的函數式和模塊化編程Java仍然是當今世界上最受歡迎的程式語言之一。
  • 【攻略】史上最強魂匣英雄 灰燼之靈詳解
    史上最強魂匣英雄?灰燼之靈火貓進階向詳解,來看看這個月魂匣英雄是如何的強大。
  • 一位資深程式設計師大牛給予Java初學者的學習路線建議
    今天我是打算來點乾貨,因此咱們就不說一些學習方法和技巧了,直接來談每個階段要學習的內容甚至是一些書籍。這一部分的內容,同樣適用於一些希望轉行到Java的同學。在大家看之前,我要先聲明兩點。1、由於我本人是Java後端開發出身,因此所推薦的學習內容是Java Web和Java後端開發的路線,非Java Web和Java後端開發的同學請適當參考其學習思想即可,切勿照搬。
  • 資源|2017Java學習路線圖:完整Java自學視頻教程+工具+API+源碼
    還有其他的開發工具到底在哪裡能下載到……各種各種的問題今天播妞特意整理的零基礎學Java學習路線相關內容從今天起不要在找藉口,不要再說想學Java卻沒有資源趕快行動起來,Java等你來探索Java學習路線圖(點擊看大圖)
  • 這才是你想要的Java學習路線!
    學習 Java 不僅是學習一門計算機語言,更多的是學習一種思想,一種開發模式。對於從事軟體行業的工作人員,掌握了 Java 語言,可以讓自己日後的事業發展得更加順利。Java 語言由於學習相對完整, Java 開發人員可以輕鬆轉入到手機開發、.NET、PHP 等語言的開發上,以後也可以更快的跨入到項目經理的行列之中。
  • Web安全測試基礎-12-學習路線
    吳老的java版《selenium webdriver 實戰寶典》和python版《selenium Webdriver 3.0 自動化測試框架實戰指南
  • 一分鐘詳解三維重建學習路線
    三維重建在計算機視覺中是十分重要的,其中涉及很多的技術內容,為了後來人能少走彎路,也為了對自己的知識框架系統總結,特記錄自己的學習路線。
  • Java 數組、List、ArrayList 詳解
    數組、List、ArrayList 詳解數組Java 語言中提供的數組是用來存儲固定大小的同類型元素。., valuek};//靜態初始化Listjava.util.ListList 是java.util包下面的一個接口(Diagram圖中綠色的I標識Interface)。
  • java反射學習記錄
    最近在學習java的反序列化,而其中java的反射機制經常被提到,所以再深入學習一下java的反射,也算是給自己打一個基礎。Java的反射(reflection)機制是指在程序的運行狀態中,可以構造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調用任意一個對象的屬性和方法。
  • 優秀Java開發者必備的技術素養——阿里巴巴《Java開發手冊》
    (點擊上方公眾號,可快速關注)|免費提供Java學習指導,學習問題可留言
  • Nginx主配置文件nginx.conf史上超細中文詳解
    Nginx主配置文件nginx.conf史上最細中文詳解... 1第1章作者簡介.
  • 頭條騰訊SSP大佬的學習路線
    列舉一下自己的學習內容中我自己認為對找工作或者對提升自己非常有幫助的一些書或資料,僅供參考~基礎知識《C++ Primer》,應該算是工具書,但我花了3個月一個字一個字啃完了,現在能記住的沒幾個了,但是好在全看完就不用看Effective C++了,基本都包含在內了。
  • Java面試題全集 第二彈(史上最強)
    import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public
  • 2021 最穩 C/C++ 學習路線
    有些同學這個月學 C++ 的路線,下個月學 Java 的路線,這是兵家大忌,不管走哪個路線,一定要沉穩,穩紮穩打。學習的過程是枯燥無味的,學習的苦痛是暫時的,未學到的痛苦則是終生的。那一般都有哪些方向呢?
  • C++伺服器開發完整學習路線C++伺服器開發完整學習路線(含免費學習資料下載地址)
    C++伺服器開發完整學習路線(含免費學習資料下載地址)相信大部分同學剛畢業或者想轉行做c++服務端開發的時候都很迷茫不知道從哪裡開始學習,於是準備參加各種培訓班或者網絡培訓,無奈動不動成千上萬元的高昂的價格另人望而卻步,對於在校學生或者剛出來就業的新人無疑是沉重都打擊,最後決定自學,但是卻不知道從哪裡下手。
  • 作圖詳解 專利技術路線圖(基礎篇)
    技術路線圖的製圖工具和布局方式多種多樣,小編將用至少兩期文章來詳解專利技術路線圖的作法,今天首先帶來基礎篇。專利技術路線圖通常包括以下分析角度:不同技術分支、不同組成結構、技術發展與專利引證關係的組合分析等,既可展示單一維度,也可展示多個維度:某一申請人就某一技術的發展路線下圖表現的是松下電工圍繞蓄熱地板的專利技術發展,展示了1998年首次提出有關專利申請以來的發展變化。
  • java學習|用maven創建java程序~
    我們已經可以運行java程序啦~如下面代碼所示一個簡單的java輸出程序:public class Main{    public static void main(String[] args){        System.out.println("Hello java");    }}
  • 程式設計師學習路線:developer-roadmap
    這倉庫的名字叫做「developer-roadmap」,其包括的學習路線涵蓋:前端、後端、DevOps、Android、React、PostgraSQL DBA。    下圖就是這個倉庫關於前端的學習路線的中文翻譯版本。