寫這裏的時候我是很迷茫的,下面這張圖就是我對集合這部分了解的全部了。老師在集合這部分涉及到了許多算法的知識,我算法的程度僅到了解幾個簡單的排序算法。幾乎每章都會對線程安全問題進行分析,線程我就記了一個鎖機制。還有 jdk 源碼的一些分析,我根本看不下去。JVM 的內容,我也沒學過。導致我看集合這部分的文章幾乎什麼都沒學到,我儘量整理一些我能理解的內容。理解不了的就暫時放着了。大家想了解這部分的內容的話,先去看其他人寫的吧。
容器
三者的區別
- Vector‘:
Vector
的所有方法都是同步的,可以由兩個線程安全的訪問一個Vector
對象。因此在不需要保證線程安全的情況下,不建議使用。底層是數組實現 - ArrayList:不保證線程安全,因此效率比
Vector
高很多。底層是數組實現。 - LinkedList:底層是雙向鏈表實現,因此新增和刪除的效率會比
ArrayList
高很多。
集合
我們可以看到 Java 的集合框架,Collection 接口是所有集合的根,然後擴展開提供了三大類集合,分別是:
- List,也就是我們前面介紹最多的有序集合,它提供了方便的訪問、插入、刪除等操作。
- Set,Set 是不允許重複元素的,這是和 List 最明顯的區別,也就是不存在兩個對象 equals 返回 true。我們在日常開發中有很多需要保證元素唯一性的場合。
- Queue/Deque,則是 Java 提供的標準隊列結構的實現,除了集合的基本功能,它還支持類似先入先出(FIFO, First-in-First-Out)或者後入先出(LIFO,Last-In-First-Out)等特定行爲。這裏不包括 BlockingQueue,因爲通常是併發編程場合,所以被放置在併發包裏。
Java 提供的默認排序算法,具體是什麼排序方式以及設計思路。
需要區分是Arrays.sort()
還是Collections.sort()
(底層是調用Arrays.sort()
);什麼數據類型;多大的數據集(太小的數據集,複雜排序是沒必要的,Java
會直接進行二分插入排序)等
- 對於原始數據類型,目前使用的是所謂雙軸快速排序(
Dual-Pivot QuickSort
),是一種改進的快速排序算法,早期版本是相對傳統的快速排序,你可以閱讀源碼。 - 而對於對象數據類型,目前則是使用
TimSort
,思想上也是一種歸併和二分插入排序(binarySort
)結合的優化排序算法。TimSort
並不是Java
的獨創,簡單說它的思路是查找數據集中已經排好序的分區(這裏叫run
),然後合併這些分區來達到排序的目的。
Java 8
引入了並行排序算法(直接使用parallelSort
方法),這是爲了充分利用現代多核處理器的計算能力,底層實現基於fork-join
框架(專欄後面會對fork-join
進行相對詳細的介紹),當處理的數據集比較小的時候,差距不明顯,甚至還表現差一點;但是,當數據集增長到數萬或百萬以上時,提高就非常大了,具體還是取決於處理器和系統環境。
集合框架的演進和發展
Java8
在 Java 8 之中,Java 平臺支持了 Lambda 和 Stream,以支持類似爲集合創建相應 stream 或者 parallelStream 的方法實現,我們可以非常方便的實現函數式代碼。這些 API是以默認方法的形式實現在 Collection 這樣的接口裏!這是 Java 8 在語言層面的新特性,允許接口實現默認方法
Java9
Java 標準類庫提供了一系列的靜態工廠方法,比如,List.of()、Set.of(),大大簡化了構建小的容器實例的代碼量。
例:List<String> simpleList = List.of("Hello","world");