Java-L08: 集合框架

李文軒 2019-03-19
聲明:這是本人學(xué)習(xí)極客時間的Java核心36講的筆記,有侵權(quán)請聯(lián)系我。


Java的集合框架,此處不包括 Map 和 java.util.concurrent 下的線程安全容器

Vector, ArrayList, LinkedList 有何區(qū)別?

  • 這三個類都實(shí)現(xiàn)了集合框架里的List,即有序集合。具體功能都有相似的地方,比如,提供按照位置進(jìn)行定位、添加或者刪除的操作,都提供迭代器以遍歷其內(nèi)容。

  • 不同在于具體設(shè)計(jì)、行為、性能和性能安全等。

    • Vector
      • 線程安全的動態(tài)數(shù)組
      • 內(nèi)部是用對象數(shù)組來保存數(shù)據(jù)
      • 可自動增加容量,每次提高一倍
    • ArrayList
      • 動態(tài)數(shù)組
      • 不是線程安全的,性能高很多
      • 可自動增加容量,每次增加50%
    • LinkedList
      • 雙向鏈表
      • 不是線程安全的
      • 不需要擴(kuò)容,size=capacity
  • 應(yīng)用場景分析

    • VectorArrayList作為動態(tài)數(shù)組,都很適合需要大量隨機(jī)訪問的場合。但是除了對尾部數(shù)據(jù)的操作,大部分(除尾部以外所有元素)操作性能都很差。

    • LinkedList的節(jié)點(diǎn)插入與刪除的性能都很好,可是隨機(jī)訪問性能較差。

    • 讀寫機(jī)制:

      • ArrayList在插入元素時,若超過當(dāng)前數(shù)組預(yù)定義的最大值時,數(shù)組需要擴(kuò)容;擴(kuò)容過程需要調(diào)用底層 System.ArrayCopy()方法進(jìn)行數(shù)組復(fù)制。在刪除元素時并不會減小容量(若需要,可調(diào)用trimToSize()方法)。在查找元素時要遍歷數(shù)組,對于非null的元素采取equals()的方式尋找。
      • LinkedList在插入元素時,先創(chuàng)建一個Entry對象,并更新此元素和前后元素的引用。查找元素時要遍歷鏈表。刪除元素時,要遍歷鏈表,找到元素,并更新前后元素的引用。
      • VectorArrayList僅在插入元素時有不同。默認(rèn)下,Vector初創(chuàng)時是一個容量為10的數(shù)組,capacityIncrement為0。當(dāng)需要擴(kuò)容時,先檢查capacityIncrement;若此值大于0,數(shù)組大小將擴(kuò)容到size+capacityIncremnet;若小于等于0(默認(rèn)值),將擴(kuò)大到原先的兩部。

Java的集合框架(Collection)

  • Map并沒有出現(xiàn)在Java的Collection
  • java.util.concurrent 這里也先不涉及

三大類集合

  • List,有序集合,提供了方便訪問、插入、刪除
  • Set,不允許重復(fù)元素,即不存在兩個對象equals返回true。
  • Queue/Deque,Java提供的標(biāo)準(zhǔn)隊(duì)列結(jié)構(gòu)的實(shí)現(xiàn)。支持 FIFO 和 LIFO 等特定行為。

Set

  • TreeSet 支持自然順序訪問;添加、刪除、包含等操作要相對低效 (log(n)時間)。

  • HashSet 利用哈希算法;若哈希散列正常,可以提供常數(shù)時間的添加、刪除、包含等操作;但不保證有序。

  • LinkedHashSet 在內(nèi)部構(gòu)建了一個記錄插入順序但雙向鏈表,從而提供了按照插入順序遍歷的能力;也保證了常數(shù)時間的添加、刪除、包含等操作;操作性能略低于HashSet,因?yàn)橐S護(hù)鏈表。

  • 遍歷元素時,HashSet性能受自身容量影響。LinkedHashSet由于內(nèi)部鏈表,遍歷性能與元素?cái)?shù)量有關(guān)。


線程安全問題

  • 其實(shí)集合框架也支持并發(fā)編程的場景

  • 實(shí)現(xiàn)方式就是每個基本方法(get、set、add)都添加 synchronized

  • 都符合迭代時 fail-fast 行為,當(dāng)發(fā)生意外當(dāng)并發(fā)修改時,盡早拋出ConcurrentModificationException 異常。

  • Collection 的工具類

static <T> List<T> synchronizedList(List<T> list)
  • 運(yùn)用
List list = Collections.synchronizedList(new ArrayList());

排序

  • 對于原始數(shù)據(jù)類型,現(xiàn)在所使用的是 雙軸快速排序(Dual-Pivot QuickSort),是一種改進(jìn)的快速排序算法
  • 對于對象數(shù)據(jù)類型,目前是TimSort,思想上是一種歸并和二分插入排序(binarySort)結(jié)合的優(yōu)化排序算法。
  • 可有調(diào)用parallelSort 方法,充分利用多核處理器的能力,底層實(shí)現(xiàn)基于fork-join框架
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ? 在編寫java程序中,我們最常用的除了八種基本數(shù)據(jù)類型,String對象外還有一個集合類,在我們的的程序中到處...
    Java幫幫閱讀 1,559評論 0 6
  • hashmap實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu),數(shù)組、桶等。 如圖所示 JDK 1.7,是以數(shù)組+鏈表組成的,鏈表為相同hash的鍵...
    不需要任何閱讀 945評論 0 1
  • 原文地址 Java集合 Java集合框架:是一種工具類,就像是一個容器可以存儲任意數(shù)量的具有共同屬性的對象。 Ja...
    gyl_coder閱讀 1,040評論 0 8
  • 在一個方法內(nèi)部定義的變量都存儲在棧中,當(dāng)這個函數(shù)運(yùn)行結(jié)束后,其對應(yīng)的棧就會被回收,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,575評論 1 14
  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 804評論 0 1

友情鏈接更多精彩內(nèi)容