可以從幾方面來看Java:
JVM
集合
IO
小知識點
個人覺得 Java 大體上可以切分為上面4個大部分。但其實還會有很多小知識點。比如說
==============
進階--看書
《 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 等適當調節下。不要小看這些,阿里雲上1G內存可是要差不多30塊錢呢,夠兩頓飯錢了。
又或者,如果在你的代碼中你要用到集合,這個時候就可以考慮下 JDK8 的新特性,集合的流式處理是JDK8 的一大特性,如下是我在工作中使用的代碼舉例(寫得不太好,不過意思就是這樣):
再另外,如果分析了 ArrayList,LinkedList,會發現,ArrayList 的性能消耗主要是擴容所引起了,那么定義 ArrayList 的時候,就不要這樣子了:
而是先估算容量大小,這樣子(估算不出那就算了):
==============
最后,Java 只是一個工具,要配合好設計模式,以及算法,數據結構。比如說你對一個數組排序,老師教冒泡,選擇算法,Java代碼寫得再好,再明了清晰,復雜度也是 O(n^2),慢。
JVM
- Java JVM:內存結構和相關參數含義 · Issue #24 · pzxwhc/MineKnowContainer · GitHub
- Java JVM:內存溢出(棧溢出,堆溢出,持久代溢出以及 nable to create native thread) · Issue #25 · pzxwhc/MineKnowContainer · GitHub
- Java JVM:垃圾回收(GC 在什么時候,對什么東西,做了什么事情) · Issue #26 · pzxwhc/MineKnowContainer · GitHub
- Java JVM:編譯加載機制與自定義類加載器 · Issue #27 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:多線程生成的原因(Java內存模型與i++操作解析) · Issue #6 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:生產者消費者問題 · Issue #8 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:Lock關鍵字(接口方法分析,ReentrantLock,ReadWriteLock) · Issue #16 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:Condition關鍵字 · Issue #10 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:synchronized 關鍵字用法(修飾類,方法,靜態方法,代碼塊) · Issue #7 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:volatile關鍵字 · Issue #11 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:ThreadLocal關鍵字 · Issue #12 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:InheritableThreadLocal 實現原理 · Issue #20 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:線程池實現原理 · Issue #9 · pzxwhc/MineKnowContainer · GitHub
- Java 多線程:CAS 與 AtomicInteger(樂觀鎖) · Issue #17 · pzxwhc/MineKnowContainer · GitHub
集合
- Java 集合:Collection,List,ArrayList,Vector,LinkedList(實現方式,對比) · Issue #18 · pzxwhc/MineKnowContainer · GitHub
- Java 集合:HashMap(put方法的實現 與 哈希沖突) · Issue #19 · pzxwhc/MineKnowContainer · GitHub
- Java 集合:HashSet,HashTable,以及 ConcurrentHashMap 概念 · Issue #21 · pzxwhc/MineKnowContainer · GitHub
IO
- Java IO:操作系統的IO處理過程以及5種網絡IO模型 · Issue #22 · pzxwhc/MineKnowContainer · GitHub
- Java IO:常見Java IO流介紹(ByteArrayInputStream,ObjectInputStream,BufferedInputStream) · Issue #23 · pzxwhc/MineKnowContainer · GitHub
小知識點
個人覺得 Java 大體上可以切分為上面4個大部分。但其實還會有很多小知識點。比如說
- Java 關鍵字:abstract,final,static 等。
- 關鍵類:Object類的幾個方法, String類,Thread類,棧,隊列的一些實現類 等其他Java常用類。
- 其他關於Java的知識,比如 jdk8的新特性(重點lambda+集合的流式操作),UML類圖等。
==============
進階--看書
《 Effective Java》《Thinking in java》《深入理解Java虛擬機》《Java並發編程實戰》這四本 是 Java 領域比較有名的書了,分別再從 虛擬機,多線程,一些小的要注意點等方面進一步提高自己的Java能力。
進階--研究 框架代碼
考本題的 EZLippi 的答案,此時可以看下一些 java 后端的框架,例如可以研究一下 Spring,如:
- Spring:AOP(JDK動態代理與CGLIB代理) · Issue #28 · pzxwhc/MineKnowContainer · GitHub
- Spring:DI原理(包括如何創建實體和具體注入) · Issue #30 · pzxwhc/MineKnowContainer · GitHub
- Spring:異常統一處理的三種方式與Rest接口異常的處理 · Issue #29 · pzxwhc/MineKnowContainer · GitHub
又或者 看看 SpringMVC ,Spring Security 的源碼流程 也是比較好的,畢竟這些都是比較流行的基於Java的一些技術:
- SpringMVC:Servlet 體系結構與 ServletContext,ServletConfig · Issue #32 · pzxwhc/MineKnowContainer · GitHub
- SpringMVC:FrameworkServlet(主要用於初始化WebApplicationContext) · Issue #34 · pzxwhc/MineKnowContainer · GitHub
- SpringMVC:DispatcherServlet(流程) · Issue #35 · pzxwhc/MineKnowContainer · GitHub
在這里,可能會對編譯期和運行期不太熟悉,對反射不太了解,對Java的異常之前好像也沒怎么接觸過,又或者,不知道 abstract,final,try-catch-finally 的實際運用場景是什么。這里都可以接觸到。
==============
最后--把知識用在工作中或者自己的項目中
例如,如果沒有工作,那么就自己做個個人博客,用Java搭建后端,部署到阿里雲。這時候可以監控下自己的Java使用了多少內存,例如簡單的使用 jstat 就可以:

又或者,如果在你的代碼中你要用到集合,這個時候就可以考慮下 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),慢。