對比 Vector、ArrayList、LinkedList 有何區別?

《Java核心技術面試精講–楊曉峯》學習筆記目錄

寫這裏的時候我是很迷茫的,下面這張圖就是我對集合這部分了解的全部了。老師在集合這部分涉及到了許多算法的知識,我算法的程度僅到了解幾個簡單的排序算法。幾乎每章都會對線程安全問題進行分析,線程我就記了一個鎖機制。還有 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 平臺支持了 LambdaStream,以支持類似爲集合創建相應 stream 或者 parallelStream 的方法實現,我們可以非常方便的實現函數式代碼。這些 API是以默認方法的形式實現在 Collection 這樣的接口裏!這是 Java 8 在語言層面的新特性,允許接口實現默認方法

Java9

Java 標準類庫提供了一系列的靜態工廠方法,比如,List.of()、Set.of(),大大簡化了構建小的容器實例的代碼量。
例:List<String> simpleList = List.of("Hello","world");

補充

Java默認排序算法

雙軸快速排序
TimSort
並行排序算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章