———————————10.4更新———————————
有評論指出下面說的不是Java的開始學習路線。其實也對,當時在大學是先學了一遍《Java程序設計》,其實也是停留在只懂寫 private,類,對象這些,很淺。而後網上認識了個網易的老師傅,就帶入門了,就開始看一些Java內存結構什麼的,就是以下的這些內容,而後後來就本身分類了學。但願對你們有幫助(固然,有些可能我的能力問題說得不對,但願你們能夠幫忙指出,謝謝)。
———————————8.25更新———————————
補充些網站(Ps:沒有利益相關,只是以爲他們寫得真蠻好):
- 併發編程網
- 金絲燕網 - 一個嚴謹的網站!
- 沈瑋 | Wei SHEN
- Java併發編程 (海子的博客園)
———————————如下原文———————————
能夠參考從這幾方面來看Java:
JVM
多線程
記憶方法:產生的緣由(內存模型)--> 解決的辦法(synchronized,Lock,Condition,volatile,ThreadLoad,AtomicInteger,CAS)--> 優化(生產者消費者模式(從源頭分析),Condition)
集合
記憶方法:Collection系列(當你分析他們的原理 ArrayList,LinkedList,Vector 做爲一類記比較好),Map系列(HashMap,HashTable,ConcurrentHashMap做爲一類記)
IO
記憶方法:重點理解 IO模型(阻塞式IO,非阻塞式IO,IO複用,信號驅動IO,異步IO)理解了這些,會有助於理解 NIO,AIO。另外,須要知道 設計模式中的裝飾器模式,會比較好理解Java的IO包。
小知識點
我的以爲 Java 大致上能夠切分爲上面4個大部分。但其實還會有不少小知識點。好比說
- Java 關鍵字:abstract,final,static 等。
- 關鍵類:Object類的幾個方法, String類,Thread類,棧,隊列,Arrays,Collections 等其餘Java經常使用類。
- 其餘關於Java的知識,好比 jdk8的新特性(重點lambda+集合的流式操做),UML類圖等。
==============
進階--看書
《
Effective Java》《Thinking in java》《深刻理解Java虛擬機》《Java併發編程實戰》這四本 是 Java 領域比較有名的書了,分別再從 虛擬機,多線程,一些小的要注意點等方面進一步提升本身的Java能力。
進階--研究
框架代碼
考本題的 EZLippi 的答案,此時能夠看下一些 java 後端的框架,例如能夠研究一下 Spring,如:
又或者 看看 SpringMVC ,Spring Security 的源碼流程 也是比較好的,畢竟這些都是比較流行的基於Java的一些技術:
在這裏,可能會對編譯期和運行期不太熟悉,對反射不太瞭解,對Java的異常以前好像也沒怎麼接觸過,又或者,不知道 abstract,final,try-catch-finally 的實際運用場景是什麼。這裏均可以接觸到。
==============
最後--把知識用在工做中或者本身的項目中
例如,若是沒有工做,那麼就本身作個我的博客,用Java搭建後端,部署到阿里雲。這時候能夠監控下本身的Java使用了多少內存,例如簡單的使用 jstat 就能夠:
這時候你能夠看到 新生代,老年代,eden區域,survivor區域等,能夠看下他們的佔比,利用-xmx,-xms,-xmn,-xss 等適當調節下。
又或者,若是在你的代碼中你要用到集合,這個時候就能夠考慮下 JDK8 的新特性,集合的流式處理是JDK8 的一大特性,以下是我在工做中使用的代碼舉例(寫得不太好,不過意思就是這樣):
List<Account> accounts = accountRepo.findAccountsByEntityCode(entityCode);
if(accounts != null) {
//若是不是葉子節點,那麼從新計算
accounts
.parallelStream()
.filter(param -> {
AccountType accountType = accountTypeService.findAccountTypeById(param.getAcctCode());
if(StringUtils.isEmpty(accountType.getIsLeaf())){
if("0".equals(accountType.getIsLeaf())){
return true;
} else {
return false;
}
} else {
return true;
}
})
.forEach(param -> getAccount0(param));
}
再另外,若是分析了 ArrayList,LinkedList,會發現,ArrayList 的性能消耗主要是擴容所引發了,那麼定義 ArrayList 的時候,就不要這樣子了:
ArrayList<Object> list = new ArrayList<Object>();
而是先估算容量大小,這樣子(估算不出那就算了):
ArrayList<Object> list1 = new ArrayList<Object>(10);
==============
最後,Java 只是一個工具,要配合好設計模式,以及算法,數據結構。好比說對數組排序,若是使用冒泡,選擇算法,Java代碼寫得再好,再明瞭清晰,複雜度也是 O(n^2),效率不是很高。