姓名:賈田田? ? ? 學號:17101223395
【嵌牛導(dǎo)讀】:隨著社會上各大企業(yè)對java人才市場的需求,大部分程序員在學Java居砖,用java語言來編寫各種程序虹脯,各種框架,這里提供了比較詳細的學習java的路線奏候,供大家參考循集。
【嵌牛鼻子】:學習java
【嵌牛提問】:如何更好的學習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的面向過程編程,包括基本數(shù)據(jù)結(jié)構(gòu)邮弹、表達式黔衡、語句、控制流肠鲫、函數(shù)調(diào)用员帮。
學習Java的面向?qū)ο缶幊袒蛄福惖妓恰⒁妙愋秃椭殿愋偷膮^(qū)別、成員氯材、方法渣锦、訪問控制、繼承氢哮、多態(tài)袋毙、接口、接口實現(xiàn)冗尤。順便學習一下面向?qū)ο蟮幕舅枷胩牵磳ο蟆⑾⒘哑摺⒎庋b皆看、繼承、多態(tài)等背零,這些通用的內(nèi)容不是Java特有的腰吟。這時候應(yīng)該已經(jīng)涉及了Java的垃圾回收。要留意即使有垃圾回收的情況下也會發(fā)生的內(nèi)存泄露(如自己設(shè)計數(shù)組容器徙瓶,元素是引用毛雇,邏輯上刪除了元素嫉称,但并沒有清成null)。注意垃圾回收只能回收內(nèi)存中的對象灵疮,除了內(nèi)存以外织阅,其它資源不能依靠垃圾回收來關(guān)閉。比如震捣,文件蒲稳、管道、Socket伍派、數(shù)據(jù)庫連接等江耀,垃圾回收是不會幫你關(guān)閉的。
學習Java的異常處理诉植,但更重要的是學習什么時候用特殊返回值而不使用異常祥国,什么時候應(yīng)該拋出異常而不處理異常,知道什么是pokemon catch及其危害晾腔,了解為什么Java的checked exception是一個糟糕的特性舌稀。如果愿意,同時學習一下Java1.7的try-with-resource語句和AutoCloseable接口灼擂。
熟悉Java常用的數(shù)據(jù)結(jié)構(gòu)壁查,如基本的數(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ū)別峻贮,以及它們是如何自動轉(zhuǎn)換的席怪。
熟悉Java標準庫里的各種工具,包括日期時間纤控、字符串格式化挂捻、IO等。**知道文件要自己在finally子句中close()船万,或者用Java1.7的try-with-resource刻撒,不要妄想垃圾回收器會幫你關(guān)掉文件。
學習一下Java的命名習慣耿导,以及JavaBeans的常規(guī)声怔,知道為什么gettertter比直接操作成員變量好。按這種方式給Java的變量碎节、方法命名捧搞。同時看看你的IDE能不能自動幫你生成getter和setter。
使用一個第三方的庫(比如Apache Commons Lang通用工具庫),讓你的程序依賴于它的二進制jar包(而不是直接拷貝源代碼)胎撇,用命令行編譯介粘、運行(注意classpath等);也熟悉一下如何用你的集成開發(fā)環(huán)境添加第三方依賴晚树。感受一下手動管理依賴關(guān)系的麻煩姻采。
學習Maven的使用,試著讓Maven幫你解決依賴關(guān)系爵憎,再試著讓Maven幫你創(chuàng)建一個Eclipse工程慨亲。再試試用Maven打包發(fā)布。
學習軟件測試宝鼓,以及JUnit的使用刑棵,以及怎么在IDE中使用JUnit。有空看一下coverage工具愚铡。
讀讀四人幫寫的《設(shè)計模式》(這本書是用C++和Smalltalk語言為例子的蛉签,但仍然適合Java)。
接下來就看具體要做哪方面的應(yīng)用了沥寥,看需求碍舍。比如(下面的沒有順序)
調(diào)試和輔助工具
學習一下你的集成開發(fā)環(huán)境提供的調(diào)試工具,加一些斷點試試邑雅。
試試用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)存的關(guān)系敌卓,以及為什么多線程編程這么難慎式。
如果還舒服,學習一下Runnable的用法,以及自帶的Executer等基本多線程工具瘪吏。
應(yīng)該已經(jīng)留意到j(luò)ava.util里面的很多容器不是線程安全的癣防,但是java.util.Collections可以幫你創(chuàng)建一些安全的版本。另外關(guān)注一下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)絡(luò)編程
學習一下IP蚂夕,TCP協(xié)議(計算機專業(yè)的應(yīng)該學過润脸,復(fù)習一下)兜叨,學習Socket編程(注意垃圾回收器不會幫你關(guān)掉Socket)荣回。
如果不是很關(guān)心HTTP弄贿,看看java.nio朵耕,學習單線程輪詢式IO復(fù)用(Selector)激率。
如果有點不明白nio的意圖的話嗅辣,了解一下c10k問題桐猬。http://www.kegel.com/c10k.html
如果身體沒有異樣的話撑蚌,大概了解一下操作系統(tǒng)(包括C語言)提供的select, poll, epoll, kqueue等接口上遥。
如果身體仍然沒有異樣的話,試著用java.nio寫一個文件服務(wù)器争涌。
如果還有精力的話粉楚,上網(wǎng)扒一扒有沒有其他的通信庫,如netty等亮垫。
如果關(guān)心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服務(wù)器端編程仅颇。學學標準的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氏仗,復(fù)習一下HTTP,找找適合的Java工具夺鲜。
你可能會覺得Jackson是一個解析JSON用的好用的東西皆尔。
數(shù)據(jù)庫
學習一下關(guān)系數(shù)據(jù)庫(計算機專業(yè)的應(yīng)該學過,復(fù)習一下)币励,包括SQL慷蠕。選一個數(shù)據(jù)庫管理系統(tǒng)熟悉一下(比如MariaDB,或者(如果你不討厭Oracle的話)用被Oracle收購了的MySQL食呻。先脫離Java單獨學學)流炕。然后看它們的官方文檔教你怎么用Java連接這種數(shù)據(jù)庫。這中間會涉及到JDBC接口搁进。同時一定要知道SQL注入安全漏洞浪感,以及掌握如何用PreparedStatement防止注入!饼问!。建議看 http://bobby-tables.com/
可能中間會涉及“事務(wù)”問題揭斧,讓你不知不覺地開始去了解java transaction api(JTA)莱革。
如果還舒服峻堰,學一學對象關(guān)系轉(zhuǎn)換(如Hibernate)。也可以學學非關(guān)系數(shù)據(jù)庫盅视,以及如何用Java訪問它們捐名。
日志記錄
學習一下slf4j和logback的用法。
如果有精力的話闹击,大概了解一下世界上有多少種Java日志框架镶蹋,以及slf4j是怎么橋接這些框架的。
構(gòu)建(build)系統(tǒng)
學習一下Ant的用法赏半。
如果還舒服的話贺归,學習一下用Ivy從Maven的倉庫里下載軟件包,解決依賴關(guān)系断箫。
版本控制
學習一種分布式版本控制器(如Git拂酣、Mercurial、Bzr仲义、Darcs等婶熬,推薦Git)的基本用法,以及如何用它管理Java工程埃撵。希望你已經(jīng)開始使用Maven了赵颅,并且知道為什么把IDE生成的工程文件(如eclipse的.project,.classpath和.metadata)放入版本控制器不好暂刘。然后了解一下如何在IDE中使用版本控制(Eclipse自帶Git插件)饺谬。
如果感覺很舒服的話,為你們實驗室搭建一個Linux+SSH+Git服務(wù)器鸳惯,裝個GitLab(一種Web界面)商蕴。
了解“集中式版本控制器”和“分布式版本控制器”的區(qū)別,并說服同事們不要再用SVN芝发、CVS或者SourceSafe等老舊的“集中式版本控制器”了绪商。開設(shè)一個GitHub賬戶。如果你不喜歡Git辅鲸,就用BitBucket等格郁。
持續(xù)集成
自己(或者為你們實驗室)搭建一個持續(xù)集成(Continuous Integration)服務(wù)器,如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í)行。
如果還舒服险绘,了解一下如何設(shè)置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)境逻杖,只是利用他們的圖形框架,寫自己的應(yīng)用程序思瘟。
如果還覺得舒服的話荸百,寫Eclipse集成開發(fā)環(huán)境的插件。
本地/外語接口
學習一下Java Native Interface(JNI)潮太,試著寫一個Java和C語言混合編程的程序管搪。
如果覺得不舒服了或者覺得欲仙欲死,就學一學Java Native Access(JNA)铡买,試一試不用任何膠水代碼而從Java直接裝載C庫更鲁,直接調(diào)用C函數(shù)。
如果連JNA也懶得學奇钞,就學一學SWIG澡为,自動生成綁定。
如果覺得舒服景埃,就學一學Java Virtual Machine Tooling Interface(JVMTI)媒至,用C程序來監(jiān)視JVM的狀態(tài)顶别。
密碼學
學一學密碼學,包括編碼拒啰、密碼分析驯绎、攻擊、對稱密鑰谋旦、公鑰系統(tǒng)剩失、數(shù)字簽名、哈希算法等册着,看看Java有沒有實現(xiàn)拴孤。
如果覺得有點不舒服(你應(yīng)該不會覺得舒服吧,除非你是學密碼學的甲捏,要不然總會覺得自己寫的程序有安全漏洞)演熟,就寫一個“人品計算器”來放松一下,要求每次輸入同一個姓名司顿,得到的人品值是固定的芒粹,但又要讓人無法用別人的人品值猜自己的人品值。
移動終端
學一學Android開發(fā)免猾。
如果有精力的話是辕,看看Dalvik虛擬機是怎么回事。
建議買一個iPhone或者iPad猎提,或許你再也不想用Android手機或者平板了获三。
歷史
如果覺得有些無聊,就去挖一挖歷史上比較火的可能和Java相關(guān)技術(shù)锨苏,比如:
Applet疙教,想想它比起html5+css3+javascript的缺點在哪里。
AWT伞租、Swing贞谓,想想為什么很少有人用Java寫圖形界面程序。你覺得Swing的程序看上去舒服嗎葵诈?中國人和殘疾人喜歡用Swing程序嗎裸弦?
JNDI,想想它比起Spring Bean Container的缺點在哪里作喘。
JSP理疙,想想它比起MVC結(jié)構(gòu)的缺點在哪里。
WSDL/SOAP泞坦,把它們和XML-RPC窖贤、RESTful Web Service比較一下。
XSLT,以及為什么它是圖靈完備的赃梧÷蓑穑可是它真的比Java本身更好用嗎?
Log4j授嘀、java.util.logging物咳、Apache Commons Logging,各自有什么問題粤攒,以及Log4j的作者本人為什么又開發(fā)了SLF4j和Logback所森?
Java最早是為什么設(shè)計的?
Type erasure是怎么回事夯接?為什么ArrayList<int>不行但ArrayList<Integer>就可以?挖一挖歷史纷妆。
其實Java不算完全面向?qū)ο蟮恼Z言盔几。Java更偏實用性,很多控制流(if語句掩幢、while循環(huán)逊拍、for循環(huán)等)來自面向過程的語言;基本數(shù)據(jù)類型(int, char, double等)也不是對象际邻。但另一些語言芯丧,比如SmallTalk,更偏向純粹的面向?qū)ο蟮脑O(shè)計世曾,包括基本的數(shù)據(jù)類型都是對象缨恒,if/while/for等也用對象和方法來實現(xiàn)。比如:
基本數(shù)據(jù)類型也是對象轮听,可以接受消息(即方法)骗露,比如:
(a + b) sqrt
這里面,a+b其實是向a發(fā)送“+”消息血巍,參數(shù)是b萧锉。sqrt也是一個消息,發(fā)給一個數(shù)述寡。
if分支是這樣做的:
l(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是“塊”的一個方法,每次對塊求值掀序,如果是真帆焕,就反復(fù)執(zhí)行第一個參數(shù)(也是“塊”)。
所以,相對其他面向?qū)ο蟮恼Z言叶雹,Java并不算很“面向?qū)ο蟆辈萍ⅰK孕枰a充一些對面向?qū)ο笳Z言的了解。