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的面向過程編程兽间,包括基本數(shù)據(jù)結構、表達式正塌、語句嘀略、控制流、函數(shù)調用乓诽。
學習Java的面向對象編程帜羊,包括類、引用類型和值類型的區(qū)別问裕、成員逮壁、方法、訪問控制粮宛、繼承、多態(tài)卖宠、接口巍杈、接口實現(xiàn)。順便學習一下面向對象的基本思想扛伍,即對象筷畦、消息、封裝、繼承鳖宾、多態(tài)等吼砂,這些通用的內(nèi)容不是Java特有的。這時候應該已經(jīng)涉及了Java的垃圾回收鼎文。要留意即使有垃圾回收的情況下也會發(fā)生的內(nèi)存泄露(如自己設計數(shù)組容器渔肩,元素是引用,邏輯上刪除了元素拇惋,但并沒有清成null)周偎。注意垃圾回收只能回收內(nèi)存中的對象,除了內(nèi)存以外撑帖,其它資源不能依靠垃圾回收來關閉蓉坎。比如,文件胡嘿、管道蛉艾、Socket、數(shù)據(jù)庫連接等衷敌,垃圾回收是不會幫你關閉的伺通。
學習Java的異常處理,但更重要的是學習什么時候用特殊返回值而不使用異常逢享,什么時候應該拋出異常而不處理異常罐监,知道什么是pokemon?catch及其危害,了解為什么Java的checked?exception是一個糟糕的特性瞒爬。如果愿意弓柱,同時學習一下Java1.7的try-with-resource語句和AutoCloseable接口。
熟悉Java常用的數(shù)據(jù)結構侧但,如基本的數(shù)組類型矢空,以及泛型容器(java.util.*),尤其是java.util.List接口和java.util.ArrayList實現(xiàn)禀横;以及java.util.Map接口和java.util.HashMap實現(xiàn)屁药。(java1.5以前的沒有泛型參數(shù)的就不用碰了)同時留意一下基本類型int,?double等和裝箱類型Integer和Double的區(qū)別,以及它們是如何自動轉換的柏锄。
熟悉Java標準庫里的各種工具酿箭,包括日期時間、字符串格式化趾娃、IO等缭嫡。**知道文件要自己在finally子句中close(),或者用Java1.7的try-with-resource抬闷,不要妄想垃圾回收器會幫你關掉文件妇蛀。
學習一下Java的命名習慣耕突,以及JavaBeans的常規(guī),知道為什么getter
tter比直接操作成員變量好评架。按這種方式給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)蛉迹。
接下來就看具體要做哪方面的應用了,看需求放妈。比如(下面的沒有順序)
調試和輔助工具
學習一下你的集成開發(fā)環(huán)境提供的調試工具北救,加一些斷點試試。
試試用jconsole或者VisualVM監(jiān)控另一個jvm的狀態(tài)芜抒。
用profiling工具尋找程序中慢的地方珍策。Eclipse有profiling工具。VisualVM也有這樣的功能宅倒。(如果不介意使用閉源軟件的話攘宙,也試試JProfiler和YourKit)
有的JVM允許在運行時更新代碼。Eclipse可以和某些JVM集成拐迁。這樣你可以頻繁修改代碼而不用頻繁重啟JVM蹭劈。對于某些“重型”工程很有用。(如果不介意使用閉源軟件的話唠亚,也試試jRebel)
多線程
學習Java的多線程編程以及l(fā)ock链方、condition的用法(包括傳統(tǒng)Java的synchronized語句以及新加的java.util.concurrent.*),學習一下如何讓線程停下來灶搜,以及為什么要頻繁確認isInterrupted()而不要用Thread.stop()。了解一下多核處理器、緩存割卖、內(nèi)存的關系前酿,以及為什么多線程編程這么難。
如果還舒服鹏溯,學習一下Runnable的用法罢维,以及自帶的Executer等基本多線程工具。
應該已經(jīng)留意到java.util里面的很多容器不是線程安全的丙挽,但是java.util.Collections可以幫你創(chuàng)建一些安全的版本肺孵。另外關注一下java.util.concurrent里面有ConcurrentMap等容器可供使用。
如果有空的話颜阐,看看memory model(內(nèi)存一致性模型)和無鎖同步(見java memory model和java.util.concurrent.atomic)平窘。
如果還有空,再了解一下除了“共享內(nèi)存多線程編程”以外有沒有別的模型(多進程multi-processing凳怨、消息傳遞message passing等)瑰艘。
反射、元編程
學習Java的反射機制肤舞,以及Annotation的用法紫新。
如果還舒服,試試java.lang.reflect.Proxy的用法李剖。
如果仍然還舒服芒率,玩一玩CGLib(一個第三方的庫)。
網(wǎng)絡編程
學習一下IP篙顺,TCP協(xié)議(計算機專業(yè)的應該學過偶芍,復習一下),學習Socket編程(注意垃圾回收器不會幫你關掉Socket)慰安。
如果不是很關心HTTP腋寨,看看java.nio,學習單線程輪詢式IO復用(Selector)化焕。
如果有點不明白nio的意圖的話萄窜,了解一下c10k問題。http://www.kegel.com/c10k.html
如果身體沒有異樣的話撒桨,大概了解一下操作系統(tǒng)(包括C語言)提供的select, poll, epoll, kqueue等接口查刻。
如果身體仍然沒有異樣的話,試著用java.nio寫一個文件服務器凤类。
如果還有精力的話穗泵,上網(wǎng)扒一扒有沒有其他的通信庫,如netty等谜疤。
如果關心Web還有HTTP佃延,就學習一下HTTP協(xié)議现诀,以及用Java進行HTTP的客戶端編程。
如果還舒服履肃,學學HTML仔沿,寫寫HTML的靜態(tài)網(wǎng)頁(不需要Java)
如果還舒服,用Java寫一個基于DOM尺棋、XPath或者CSS Selector的網(wǎng)頁解析器(爬網(wǎng)頁)封锉。
如果還舒服,學學Java的Servlet接口(先別學jsp)進行Web服務器端編程膘螟。學學標準的Servlet容器怎么用成福,包括web.xml的用法以及l(fā)istener、filter等概念荆残。以及某個Servlet容器(如Jetty或者Tomcat)的具體用法奴艾。
如果仍然還舒服,試著學一種模板語言(如haml, velocity, freemarker脊阴,【還有其他更好的框架嗎握侧?我不知道】, String.format,如果真的想學JSP的話JSP倒是也行嘿期,但不推薦)品擎。
如果仍然覺得舒服,學學Spring框架中的Web框架备徐,或者Struts萄传,看你的口味。
如果還舒服蜜猾,看看Spring Bean Container以及里面各種亂七八糟的工具检疫。
如果還舒服散罕,或者有需求露乏,了解一下什么是RESTful Web Service枢舶,復習一下HTTP,找找適合的Java工具肩豁。
你可能會覺得Jackson是一個解析JSON用的好用的東西脊串。
數(shù)據(jù)庫
學習一下關系數(shù)據(jù)庫(計算機專業(yè)的應該學過,復習一下)清钥,包括SQL琼锋。選一個數(shù)據(jù)庫管理系統(tǒng)熟悉一下(比如MariaDB,或者(如果你不討厭Oracle的話)用被Oracle收購了的MySQL祟昭。先脫離Java單獨學學)缕坎。然后看它們的官方文檔教你怎么用Java連接這種數(shù)據(jù)庫。這中間會涉及到JDBC接口篡悟。同時一定要知道SQL注入安全漏洞谜叹,以及掌握如何用PreparedStatement防止注入X仪蕖!叉谜。建議看 http://bobby-tables.com/
可能中間會涉及“事務”問題旗吁,讓你不知不覺地開始去了解java transaction api(JTA)踩萎。
如果還舒服停局,學一學對象關系轉換(如Hibernate)。也可以學學非關系數(shù)據(jù)庫香府,以及如何用Java訪問它們董栽。
日志記錄
學習一下slf4j和logback的用法。
如果有精力的話企孩,大概了解一下世界上有多少種Java日志框架锭碳,以及slf4j是怎么橋接這些框架的。
構建(build)系統(tǒng)
學習一下Ant的用法勿璃。
如果還舒服的話擒抛,學習一下用Ivy從Maven的倉庫里下載軟件包,解決依賴關系补疑。
版本控制
學習一種分布式版本控制器(如Git歧沪、Mercurial、Bzr莲组、Darcs等诊胞,推薦Git)的基本用法,以及如何用它管理Java工程锹杈。希望你已經(jīng)開始使用Maven了撵孤,并且知道為什么把IDE生成的工程文件(如eclipse的.project,.classpath和.metadata)放入版本控制器不好竭望。然后了解一下如何在IDE中使用版本控制(Eclipse自帶Git插件)邪码。
如果感覺很舒服的話,為你們實驗室搭建一個Linux+SSH+Git服務器咬清,裝個GitLab(一種Web界面)闭专。
了解“集中式版本控制器”和“分布式版本控制器”的區(qū)別,并說服同事們不要再用SVN枫振、CVS或者SourceSafe等老舊的“集中式版本控制器”了喻圃。
開設一個GitHub賬戶。如果你不喜歡Git粪滤,就用BitBucket等斧拍。
持續(xù)集成
自己(或者為你們實驗室)搭建一個持續(xù)集成(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放航,如果你需要進行大量數(shù)值運算的話烈拒。
分布式計算
學學MapReduce的思想以及它的實現(xiàn)。
如果還舒服广鳍,學學Scala語言以及號稱比MapReduce快得多的Apache Spark荆几。
進程間通信
看看ActiveMQ、MINA和RMI赊时。
其他語言(JVM)
學習另一門跑在JVM上的語言或者實現(xiàn)(如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)和優(yōu)化器(optimiser)的概念呜呐。
——如果對編譯器的話題不感到畏懼,了解一下method JIT和tracing JIT的概念和區(qū)別纷铣。
內(nèi)存管理
學學垃圾回收的幾種基本算法卵史,包括mark-sweep、mark-compact搜立、semi-space、generational槐秧、mark-region等啄踊,各自的性能,以及為什么樸素的reference counting是不完整的刁标。知道為什么finalizer性能很糟糕颠通,而且標準并不要求finalizer在程序退出前一定會執(zhí)行。
如果還舒服膀懈,了解一下如何設置Java虛擬機的堆大小限制(如HotSpot虛擬機的-Xmx選項等)顿锰。
了解一下Java里的WeakReference以及SoftReference和PhantomReference,以及它們什么時候有用启搂,以及為什么它們實現(xiàn)起來有些困難硼控。
如果有精力,了解一下Hotspot虛擬機的內(nèi)存管理算法是什么樣的胳赌。
動態(tài)裝載
學學Java的動態(tài)裝載(class loading)
如果還舒服的話牢撼,學學OSGI以及它的一種實現(xiàn)(如Felix或者Equinox)
如果仍然很舒服的話,學學寫基于Eclipse平臺的程序疑苫。不是Eclipse集成開發(fā)環(huán)境熏版,只是利用他們的圖形框架,寫自己的應用程序捍掺。
如果還覺得舒服的話撼短,寫Eclipse集成開發(fā)環(huán)境的插件。
本地/外語接口
學習一下Java Native Interface(JNI)挺勿,試著寫一個Java和C語言混合編程的程序曲横。
如果覺得不舒服了或者覺得欲仙欲死,就學一學Java Native Access(JNA)满钟,試一試不用任何膠水代碼而從Java直接裝載C庫胜榔,直接調用C函數(shù)胳喷。
如果連JNA也懶得學,就學一學SWIG夭织,自動生成綁定吭露。
如果覺得舒服,就學一學Java Virtual Machine Tooling Interface(JVMTI)尊惰,用C程序來監(jiān)視JVM的狀態(tài)讲竿。
密碼學
學一學密碼學,包括編碼弄屡、密碼分析题禀、攻擊、對稱密鑰膀捷、公鑰系統(tǒng)迈嘹、數(shù)字簽名、哈希算法等全庸,看看Java有沒有實現(xiàn)秀仲。
如果覺得有點不舒服(你應該不會覺得舒服吧,除非你是學密碼學的壶笼,要不然總會覺得自己寫的程序有安全漏洞)神僵,就寫一個“人品計算器”來放松一下,要求每次輸入同一個姓名覆劈,得到的人品值是固定的保礼,但又要讓人無法用別人的人品值猜自己的人品值。
移動終端
學一學Android開發(fā)责语。
如果有精力的話炮障,看看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的作者本人為什么又開發(fā)了SLF4j和Logback启涯?
Java最早是為什么設計的?
Type erasure是怎么回事邓厕?為什么ArrayList不行但ArrayList就可以逝嚎?挖一挖歷史。
其實Java不算完全面向對象的語言详恼。Java更偏實用性,很多控制流(if語句引几、while循環(huán)昧互、for循環(huán)等)來自面向過程的語言;基本數(shù)據(jù)類型(int, char, double等)也不是對象伟桅。但另一些語言敞掘,比如SmallTalk,更偏向純粹的面向對象的設計楣铁,包括基本的數(shù)據(jù)類型都是對象玖雁,if/while/for等也用對象和方法來實現(xiàn)。比如:
基本數(shù)據(jù)類型也是對象盖腕,可以接受消息(即方法)赫冬,比如:
(a + b) sqrt
這里面,a+b其實是向a發(fā)送“+”消息溃列,參數(shù)是b劲厌。sqrt也是一個消息,發(fā)給一個數(shù)听隐。
if分支是這樣做的:
|(x < y) ifTrue: [
max := y.
i := j
] ifFalse: [
max := x.
i := k
]
ifTrue:ifFalse: 是一個Boolean對象的一個方法补鼻,取兩個參數(shù),每個是一個“塊”,分別在真和假的情況下執(zhí)行风范。
還有while循環(huán)是這樣做的:
|[i < 100] whileTrue: [
sum := sum + i.
i := i + 1
]
whileTrue是“塊”的一個方法咨跌,每次對塊求值,如果是真硼婿,就反復執(zhí)行第一個參數(shù)(也是“塊”)锌半。
所以,相對其他面向對象的語言加酵,Java并不算很“面向對象”拳喻。所以需要補充一些對面向對象語言的了解。
以上內(nèi)容來自網(wǎng)絡猪腕,覺得有用歡迎分享/收藏
遇到學習問題冗澈?歡迎留言或微信對話框咨詢!
■行業(yè)動態(tài)
1陋葡、最新的 Java SE 平臺和 JDK 版本發(fā)布計劃
前不久發(fā)布的 Java 9 除了發(fā)布了重大更新外亚亲,還公布了一個全新版本的發(fā)布計劃。該計劃基于 JEP 223腐缤,用于未來 Java 平臺版本的發(fā)布捌归。基于 JEP 233 的發(fā)布計劃的主要目標如下所示:
● 版本號直觀岭粤,易于理解
● 與當前行業(yè)的實際情況相一致
● 能兼容現(xiàn)有的包系統(tǒng)和平臺部署機制
● 避免在版本的一種元素中編碼兩種信息
●提供一個簡單 API惜索,用于版本號的解析、驗證和比較(詳情:https://www.infoq.com/news/2017/11/new-version-scheme-java)
2剃浇、構建用戶界面的 JavaScript 庫 React 16.1.1 發(fā)布
React 16.1.1 已發(fā)布巾兆,React 是 Facebook 推出的一個為數(shù)據(jù)提供渲染為 HTML 視圖,用來構建用戶界面的開源 JavaScript 庫虎囚。16.1.1 更新內(nèi)容:
●React改進關于未定義組件類型的警告角塑。
●React DOM支持捕獲屬性的字符串值。
● ...(詳情:https://github.com/facebook/react/releases/tag/v16.1.1)
3淘讥、HBase 的 SQL 驅動 Apache Phoenix 4.13 發(fā)布
Apache Phoenix 4.13 已發(fā)布圃伶,Apache Phoenix 是 HBase 的 SQL 驅動。Phoenix? 4.x 與 HBase 0.98 和 1.3 兼容蒲列。更新亮點:
● 修復在連接時創(chuàng)建 SYSTEM.CATALOG 快照的 bug
● 關于行刪除處理的大量錯誤修復
● 統(tǒng)計收集改進
● ....詳情:http://phoenix.apache.org/download.html)
親的評論小編的動力