2022-8-6 集合容器

什麼是集合

集合框架:用於存儲數據的容器。

集合框架是為表示和操作集合而規定的一種統一的標準的體系結構。 任何集合框架都包含三大塊內容:
對外的接口、接口的實現和對集合運算的算 法。

接口:表示集合的抽象數據類型。接口允許我們操作集合時不必關注具體實現, 從而達到「多態」。在面
向對象編程語言中,接口通常用來形成規範。

實現:集合接口的具體實現,是重用性很高的數據結構。

算法:在一個實現了某個集合框架中的接口的對象身上完成某種有用的計算的方 法,例如查找、排序
等。這些算法通常是多態的,因為相同的方法可以在同一個 接口被多個類實現時有不同的表現。事實
上,算法是可復用的函數。 它減少了程序設計的辛勞。
集合框架通過提供有用的數據結構和算法使你能集中注意力於你的程序的重要部 分上,而不是為了讓程
序能正常運轉而將注意力於底層設計上。
通過這些在無關API之間的簡易的互用性,使你免除了為改編對象或轉換代碼以 便聯合這些API而去寫大量的代碼。 它提高了程序速度和質量。

常用的集合類

Map接口和Collection接口是所有集合框架的父接口:

  1. Collection接口的子接口包括:Set接口和List接口
  2. Map接口的實現類主要有:HashMap、TreeMap、Hashtable、 ConcurrentHashMap以及Properties等
  3. Set接口的實現類主要有:HashSet、TreeSet、LinkedHashSet等
  4. List接口的實現類主要有:ArrayList、LinkedList、Stack以及Vector等

集合的特點

對象封裝數據,對象多了也需要存儲。集合用於存儲對象。
對象的個數確定可以使用數組,對象的個數不確定的可以用集合。因 為集合是可變長度的。

集合的作用

  1. 容量自增長;
  2. 提供了高性能的數據結構和算法,使編碼更輕鬆,提高了程序速度和質量;
  3. 允許不同 API 之間的互操作,API之間可以來回傳遞集合;
  4. 可以方便地擴展或改寫集合,提高代碼復用性和可操作性。
  5. 通過使用JDK自帶的集合類,可以降低代碼維護和學習新API成本。

集合與數組的區別

數組是固定長度的;集合可變長度的。
數組可以存儲基本數據類型,也可以存儲引用數據類型;集合只能存 儲引用數據類型。

數組存儲的元素必須是同一個數據類型;集合存儲的對象可以是不同 數據類型。

數據結構:就是容器中存儲數據的方式。

對於集合容器,有很多種。因為每一個容器的自身特點不同,其實原理在於每個 容器的內部數據結構不
同。

集合容器在不斷向上抽取過程中,出現了集合體系。在使用一個體系的原則:參 閱頂層內容。建立底層
對象。

集合框架底層數據結構

Collection:

List:

Arraylist: Object數組
Vector: Object數組
LinkedList: 雙向循環鏈表

Set:

HashSet(無序,唯一):基於 HashMap 實現的,底層採用 HashMap 來保存元素
LinkedHashSet: LinkedHashSet 繼承與 HashSet,並且其內部是通過 LinkedHashMap 來實現
的。有點類似於我們之前說的LinkedHashMap 其內部是基 於 Hashmap 實現一樣,不過還是有一點點區別的。
TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹。)

Map

HashMap: JDK1.8之前HashMap由數組+鏈表組成的,數組是HashMap的主 體,鏈表則是主要
為了解決哈希衝突而存在的(「拉鏈法」解決衝突).JDK1.8以後
在解決哈希衝突時有了較大的變化,當鏈表長度大於閾值(默認為8)時,將鏈錶轉 化為紅黑樹,
以減少搜索時間

LinkedHashMap:LinkedHashMap 繼承自 HashMap,所以它的底層仍然是 基於拉鏈式散列結
構即由數組和鏈表或紅黑樹組成。另外,LinkedHashMap 在上面 結構的基礎上,增加了一條雙向
鏈表,使得上面的結構可以保持鍵值對的插入順序。 同時通過對鏈表進行相應的操作,實現了訪問
順序相關邏輯。

HashTable: 數組+鏈表組成的,數組是 HashMap 的主體,鏈表則是主要為 了解決哈希衝突而存在的
TreeMap: 紅黑樹(自平衡的排序二叉樹)

LinkedHashSet:在添加數據的同時維護數據的添加順序
效率要比HashSet略低一些。

TreeSet
排序規則:
要排序的對象的類必須實現Comparable接口

Set集合如何確保數據的不重複?
保證數據類型的類要重寫hashCode和equals方法。

比較接口:
Comparable接口:自然排序,排序規則是固定。
Comparator接口:臨時排序

Map接口:
1.存儲對值K-V key-value
2.key不能重複,value是可以重複的
3.沒有順序(添加的先後順序)

HashMap內部存儲結構:
jdk1.7之前:鏈表 + 數組
jdk1.7及之後:鏈表 + 數組 + 紅黑樹

Properties:屬性
Properties是Hashtable的子類,更多地是用來操作屬性文件。

面試題: * HashMap基本上面試90%問原理!!!

  • 1.Collection和Map接口的區別

  • 2.ArrayList和LinkedList的區別

  • 3.ArrayList和Vector的區別

  • 4.List和Set的區別

  • 5.HashSet和LinkedHashSet的區別和聯繫

  • Hashtable和HashMap的區別

  • 1.HashMap是線程異步,線程不安全的,Hashtable是線程同步,線程安全

  • 2.HashMap的key是可以為null的,Hashtable是不可以為null

  • 線程安全問題:

  • 迭代器是依賴於集合而存在,在判斷成功以後,集合中新增了元素,

  • 迭代器不知道,所以就報錯