1. 程式人生 > >集合系列開篇:為什麼要學集合?

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

集合可以說是學習 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 的原始碼也是看不懂的。

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

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