1. 程式人生 > >萬樹IT:java的用處及學習方向

萬樹IT:java的用處及學習方向

     萬樹IT學院 > 萬樹知識庫 > JAVA >

萬樹IT:java的用處及學習方向

更新時間:2017-12-11 09:03   來源:萬樹IT學院   瀏覽次數: 120

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手機或者平板了。