是繼續往后學到做項目的時候弄明白呢還是剛開始就要弄懂它們?
關于這個問題,幾乎所有從業者都會以過來人身份建議你:
先把筆試/面試題整明白,把項目中用到的技術學會用,至于 IO 和 線程 可以先放一放,以后不斷做項目不斷理解。相信所有從業者都是從這一部分一步一步走過來的,因此建議肯定是有道理的。
但以我們對很多新手在項目中的表現來看,我們還是傾向于先把 IO 和 多線程最基本的東西整明白了再繼續向后學習。
另外就是,整明白 IO 和 多線程 跟 做項目 并不沖突,兩者可以同時進行。把 IO 和 多線程 整明白了有助于做項目,通過做項目可以加深對 IO 和 多線程 的理解。
以下簡單介紹一下我們期望新手能夠掌握的 IO 和 多線程 知識 以及 我們建議的學習方法。
1、IO部分
這部分內容相對于多線程來說容易多了,是初學者可以搞明白的。
在 Java IO 部分,我們建議初學者依次序掌握以下內容:
文件( 通過 File 類的實例操作 文件 和 目錄 )流 ( 輸入流/輸出流 、字符流/字節流 、節點流/過濾流 )順序訪問文件和隨機訪問文件對象序列化和反序列化如果以上內容學習起來比較輕松,建議再依次序學習以下內容:
JDK 1.7 之前的 NIO ( Buffer 、Channel 、 Selector )
JDK 1.7 之后的 NIO ( 這部分比較多,這里不羅列 )
這里與一般圖書資料或視頻資料建議的學習順序不太一樣,我們建議初學者先學習 File 類,徹底理解 File 實例的含義,理解 文件 和 目錄 的區別,理解 文件元數據 和 文件內容 的區別,理解字符編碼對文件的影響,然后再學習 IO 部分。
學習 IO 部分也要講究學習方法,比如學習順序。
雖然傳統 IO 部分涉及的類非常多,但并不是無規律可循,實際上只需要掌握四個類的用法,基本上就可以搞定其它的 IO 類了,這四個類是:
java.io.InputStream
java.io.OutputStream
java.io.Reader
java.io.Writer
以上四個類分別對應了字節輸入流、字節輸出流、字符輸入流、字符輸出流。
以其中的 InputStream 為例,該類屬于字節流,是所有表示字節輸入流的類的父類,掌握這個類的用法,等同于從根本上掌握了字節輸入流的用法。另外三個類的地位與 InputStream 類的地位是相同的。
以下以字節流為例展示傳統 IO 中字節流的繼承體系:
同樣在學習完我們建議掌握的傳統 IO 知識后,在學習 NIO 時,也可以采用同樣的策略,比如學習 Buffer 可以從最頂層的 Buffer類 學起來,學習 Channel 可以從最頂層的 Channel接口 學起。
2、多線程部分
在整個 Java 基礎部分,這部分屬于偏難的,甚至很多高校講到這部分后老師都是略過去或者僅講一下如何創建線程、如何啟動線程。
雖然說這部分偏難,有些朋友為了相對深入研究這部分,甚至需要惡補一下操作系統知識,但這仍然不是我們要放棄這部分的理由。
實際上,所有的從業者都知道的,真正從事開發工作后,我們所使用的框架和容器基本上都把多線程部分封裝了,果真等到做項目時、等到工作后再去琢磨多線程,恐怕會廢掉很多人(很多人恐怕再也不會去琢磨多線程了)。曾經面試過號稱有五年工作經驗的人,對多線程部分甚至連最基本的知識都不能準確作答。
所以我們建議多線程部分還是要先掌握一些基礎知識并在剛開始學習的時候就開始琢磨起來,以后工作了做項目時才會有更深的體會,當然也會通過項目更加加深理解。
這部分我們建議初學者依次序掌握以下內容:
操作系統、程序、進程、線程之間的關系
線程調度方式 ( 協作式/搶占式 ) 、理解并行和并發
創建線程的方法 ( 建議先學 Thread 和 Runnable ,其它先放放 )
線程狀態
線程調度 ( priority 、yield 、join 、sleep 、demon )
同步和互斥
線程通信 ( wait / notify)
學習以上內容之后,建議在學習以下內容:
多線程并發
線程通信 (多線程之間有數據傳遞,不僅是 wait 和 notify )
線程池
因為這部分內容一旦展開就非常非常多,所以,建議初學者在剛開始不要再繼續深入研究,到此打住。等到工作兩三年后再回來深入研究這部分內容也來得及。