集合系列開篇:為什么要學集合?

集合可以說是學習 Java 中最重要的一塊知識點了,無論做任何業務系統,集合總是最為基礎的那塊 API。我第一次接觸集合,是在我大三的時候,那時候去面試,面試官問我:你了解過集合嗎?可惜那時候沒什么項目經驗,所以基本沒有了解過,因此也錯失了機會。

到了現在,我已經工作了5年了,也做過了大大小小十幾個項目。這些項目中有簡單的 SSH 項目,也有分布式高并發的復雜項目。無論在哪個項目中,關于集合的時候是必不可少的。但我現在慢慢回顧過去做的項目,我發現自己使用到的集合還是比較少,基本上只有:ArrayList、HashSet、HashMap 這幾個。

但當我開始深入去了解 JDK 集合的整個體系時,我發現之前的我了解得確實非常淺顯。例如關于 List 的實現有 ArrayList、LinkedList、Vector、Stack 這四種實現,但我們很多時候只是直接使用 ArrayList,而不是根據場景去選擇。

1.學習集合源碼,能夠讓我們使用得更加準確。

當我們深入學習了源碼之后,我們就能夠了解其特性,從而能夠根據我們的使用場景去做出更好的選擇,從而讓我們的代碼運行效率更高。

我們舉一個最簡單的例子 —— ArrayList 和 LinkedList。它們兩者底層采用了完全不同的實現方式,ArrayList 使用數組實現,而 LinkedList 則使用鏈表實現。這使得 ArrayList 的讀取效率高,而 LinkedList 的讀取效率低。但因為 LinkedList 采用鏈表實現,所以其增加和刪除比較方便,而 ArrayList 則比較麻煩。所以 ArrayList 比較適合用于讀場合較多的情況,而 LinkedList 比較適合用于增加、刪除較多的場景。

我們來看另外一個例子 —— HashMap 和 TreeMap。乍看之下,他們都是 Map 集合的實現,但是它們內部有著截然不同的實現。HashMap 是 Map 接口的哈希實現,其內部使用了鏈表和紅黑樹實現。而 TreeMap 是 Map 接口的有序實現,其內部使用了紅黑樹實現。所以 HashMap 一般用來存儲 key、value 的實現,而 TreeMap 常用存儲需要排序的元素。

除了我們舉的這兩個例子之外,還有許多這樣的例子,比如:HashMap 與 LinkedHashMap 的區別,HashMap 與 WeakHashMap 的區別,LinkedList 與 ArrayDeque 的區別。

2.學習集合源碼,讓我們學習經典的設計方式。

在集合的整個架構設計中,其類繼承體系非常簡單,但是卻很經典。例如:Collection 接口設計了集合通用的操作,每個集合類型都有對應的接口(List、Set、Map),每個集合類型都有對應的抽象實現(AbstractList、AbstractSet、AbstractMap)等。

當我們閱讀這些源碼的時候,這種設計方式都會潛移默化地影響我們。當我們之后自己設計一個框架的時候,我們就會不知不覺地用上去。所有的創新都是從模仿開始的,所以閱讀優秀的集合源碼很重要。

3.幫助通過面試,獲得更高的薪酬。

現在關于集合的原理是 Java 工程師面試的家常菜,幾乎每一個企業的面試都會問到。如果你連這塊東西都沒搞清楚,那么你就不需要聊其他了,直接被干掉。而如果你能將整個 Java 集合體系清晰地說出去,并且舉一反三地對比,那么你就比其他人優秀了。

4.學習經典的數據結構。

還記得大學在學習數據結構的時候,我們都是從理論上去記憶。但是當我看完集合源碼之后,我忽然發現——JDK集合源碼簡直就是數據結構的最佳實踐呀!

數據結構中最為基礎的幾個結構為:順序表、單鏈表、雙向鏈表、隊列、棧、二叉堆、紅黑樹、哈希表。這些所有的實現都能在 JDK 集合的實現中找到。例如:ArrayList 就是順序表的實現,LinkedList 就是雙向鏈表的實現,Stack 就是棧的實現,HashMap 就是哈希表的實現,TreeMap 就是紅黑樹的實現,PriorityQueue 就是二叉堆的實現。

5.所有技術的基礎

集合源碼可以說是 JDK 所有源碼中最為簡單的一塊了,而且也是其他所有源碼的基礎。例如線程池的源碼中也大量使用了阻塞隊列,如果你連集合源碼都搞不懂,那么線程池的源碼你也肯定看不懂的。而如果線程池源碼看不懂,那么你 netty 的源碼也看不懂的。netty 源碼看不懂,那么 dubbo 的源碼也是看不懂的。

看明白了么?這些技術都是一換扣著一換的。如果你想要后續學習更加快速,那么你就必須把最基礎的東西學明白了。如果連最基礎的東西都沒學明白,就直接去學其他更復雜的東西,最后只會越來越難,最終逃脫不了放棄的命運。

讀到了這里,我相信你也對集合的重要性有了不一樣的認識。那么接下來一段時間,就讓我和你一起來深入學學集合源碼吧。如果覺得讀了有用,那么請給我一個贊吧。你們的贊是我繼續寫下去的動力!

posted @ 2019-08-23 09:06 陳樹義 閱讀(...) 評論(...) 編輯 收藏