Java筆記3:Collection接口

Java集合

    Java中集合類主要用於保存、盛裝其他類型的數據,因此集合類也稱爲容器類。所有的集合類都位於java.util包下,容器類只能保存引用類型。Java中的集合類主要有兩個接口:CollectionMap,本文主要討論Collection接口。Collection接口的繼承樹如下:

Collection

Set接口

  • Set接口與Collection基本相同,沒有提供額外的方法
  • Set接口的所有實現類都不允許包含重複元素

HashSet類

  • HashSet按照哈希碼來存儲集合中的元素,因此具有很好的存取和查找性能。
  • 不保證元素的排列順序
  • 不是線程安全的
  • 元素值可以是null

    向HashSet中存入一個新元素時,HashSet會調用該對象的hashCode()方法來得到該對象的哈希值,然後根據哈希值決定該對象在集合中的存儲位置。如果兩個元素equals()方法返回true,但是哈希值不等,仍然可以添加成功;反過來,如果兩個對象哈希值相同但是equals()返回false,也仍然可以添加成功。

如果需要把某個類型的對象保存到HashSet中,重寫該類的hashCode()方法和equals()方法時,儘量保證如果equals()方法返回true,那麼其哈希值也要相等。

    由於HashSet的存取和查找都是依賴於哈希值,因此在存儲可變對象時會有風險,如果修改HashSet集合中的對象,有可能導致該對象的哈希值變化,從而導致HashSet無法準確訪問該對象。

HashSet底層實現是基於HashMap的,具體可參照HashMap的實現。

LinkedHashSet類

     LinkedHashSetHashSet的子類,內部使用了一個鏈表維護了元素的插入順序,因此性能略低於HashSet,但是在迭代時有很好的性能。

TreeSet類

     TreeSetSortedSet接口的實現類,可以確保集合元素處於排序狀態。支持兩種排序方法:

  • 自然排序:直接調用元素的compareTo方法比較元素之間的大小(實現了Comparable接口的對象),然後將集合元素按升序排列
  • 定製排序:在構造TreeSet實例時,提供一個Comparator對象用於對元素進行比較。

Set接口性能分析

  • HashSet的性能總是比TreeSet好,因爲排序需要額外的開銷。
  • LinkedHashSet一般情況下比HashSet略慢,但是在遍歷訪問時,LinkedHashSet會更快。

List接口

  • List接口根據整數索引訪問其中的元素。

ArrayList類和Vector類

  • 相同點:

    • 長度動態可變
    • 內部用Object[]數組實現
    • 不指定初始容量時,默認爲10;如果需要一次性添加大量元素,可使用ensureCapacity(int minCapacity)方法,減少重分配的次數提高性能。
  • 不同點:

    • Vector是線程安全的,而ArrayList不是線程安全的
    • Vector的性能低於ArrayList

固定長度的List

  • Arrays.asList(Object... a)方法可以把一個數組或一些對象轉換成一個List集合,但是返回的是Arrays.ArrayList的實例,其長度固定,只能遍歷訪問該集合裏的元素,不可增加、刪除。

Queue接口

  • 用於模擬隊列,是一個“先進先出”(FIFO)的容器。

PriorityQueue實現類

  • 即數據結構中“優先隊列”的實現
  • 排序方式與TreeSet一致

Deque接口與ArrayDeque類

  • Deque接口是Queue接口的子接口,表示一個雙端隊列
  • 該接口有一個實現類ArrayDeque,用數組Object[]實現

LinkedList實現類

  • 內部用鏈表的像是保存集合中的元素
  • 隨機訪問性能價差,插入刪除元素的性能較好

各種線性表的性能分析

     List接口是一種線性表接口,其不同的實現在不同的應用場景中有性能差異

  • 如果需要遍歷集合元素,對於ArrayList對象和Vector對象應該使用索引來訪問;而對於LinkedList對象,應該採用迭代器來遍歷
  • 如果需要經常執行插入、刪除操作,可考慮使用LinkedList
  • 如果有多個線程需要同時訪問List集合中的元素,可考慮使用Collections將集合包裝成線程安全的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章