先來看一張集合概況圖,這裏從上到下列舉了幾個最常常用的集合java
一、集合接口面試
java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操做的通用接口方法。Collection接口在Java 類庫中有不少具體的實現。Collection接口的意義是爲各類具體的集合提供了最大化的統一操做方式。聲明瞭適用於JAVA集合(只包括Set和List)的通用方法。Set 和List 都繼承了Conllection,Map沒有.後端
JAVA集合主要分爲三種類型:Set(集),List(列表),Map(映射)數組
Set集合:集合元素是不能重複的,元素是沒有順序的,因此它不能基於位置訪問元素。安全
List集合: 集合元素是能夠重複的,元素是有順序的,因此它能夠基於位置訪問元素。數據結構
Map:它包含鍵值對。Map的鍵是不能重複的,能夠保證元素的插入順序,也能夠排序。多線程
三、集合介紹架構
Set(集):併發
HashSetdom
HashSet是基於HashMap實現的,它不容許出現重複元素,不保證和政集合中元素的順序,容許包含值爲null的元素,但最多隻能有一個null元素。
TreeSet
TreeSet能夠實現排序等功能的集合,它在講對象元素添加到集合中時會自動按照某種比較規則將其插入到有序的對象序列中,並保證該集合元素按照「升序」排列。
LinkedHashSet
具備HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序),因而在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
List(列表):
ArrayList
內部結構基於數組實現,能夠對元素進行隨機的訪問,向ArrayList中插入與刪除元素的速度慢。
LinkedList
LinkedList 是一個繼承於AbstractSequentialList的雙向鏈表,能夠被看成堆棧、隊列或雙端隊列進行操做。LinkedList同時還實現了List、Deque(雙端隊列)、Cloneable(能克隆)、java.io.Serializable(支持序列化,能經過序列化去傳輸)等接口,LinkedList是非同步的。
每一個節點除含有元素外,還包含向前,向後的指針。
新建一個LinkedList,生成一個頭節點(header,就是一個頭指針),它的元素爲null。
它自包含,next和previous指針都指向本身。 執行add(Object obj)方法後,會生成一個新節點
Header節點的next指向鏈表的第一個節點,previous指向鏈表的最後一個節點,在這裏都是first,再增長一個對象,它的形狀像下面這樣。
Vector
Vector 是矢量隊列,它是JDK1.0版本添加的類。繼承於AbstractList,實現了List(支持相關的添加、刪除、修改、遍歷等), RandomAccess(隨機訪問功能), Cloneable(能被克隆)這些接口。
Vector其實是經過一個數組去保存數據的。當咱們構造Vecotr時;若使用默認構造函數,則Vector的默認容量大小是10。
當Vector容量不足以容納所有元素時,Vector的容量會增長。若容量增長係數 >0,則將容量的值增長「容量增長係數」;不然,將容量大小增長一倍。Vector的克隆函數,便是將所有元素克隆到一個數組中。和ArrayList不一樣,Vector中的操做是線程安全的。
Stack
Stack是棧,它的特性是:先進後出(FILO, First In Last Out)。
Stack繼承於Vector(矢量隊列)的,因爲Vector是經過數組實現的,這就意味着,Stack也是經過數組實現的,而非鏈表。
Map(映射):
Map基於散列表的實現,Map 是一種把鍵對象和值對象映射的集合,它的每個元素都包含一對鍵對象和值對象。
HashMap
HashMap底層就是一個數組結構(叫作Entry Table),數組中的每一項又是一個鏈表(叫作Bucket,用於解決hash衝突而設計的)。當新建一個HashMap的時候,就會初始化一個數組。插入和查詢「鍵值對」的開銷是固定的,能夠經過構造器設置容量capacity和負載因子load factor,以調整容器的性能。初始化結構以下:
每一個bucket包含一個Entry(map自定義的一種結構,包含一個日後的指針)的鏈表。
在put(key, value)後,它的結構以下:
LinkedHashMap
相似於HashMap,可是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序,只比HashMap慢一點。而在迭代訪問時發而更快,由於它使用鏈表維護內部次序。
TreeMap
基於紅黑樹數據結構的實現,查看「鍵」或「鍵值對」時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特色在於,你獲得的結果是通過排序的。TreeMap是惟一的帶有subMap()方法的Map,它能夠返回一個子樹。
WeakHashMap
弱鍵(weak key)Map,Map中使用的對象也被容許釋放: 這是爲解決特殊問題設計的。若是沒有map以外的引用指向某個「鍵」,則此「鍵」能夠被垃圾收集器回收。
IdentifyHashMap
使用==代替equals()對「鍵」做比較的hash map,專爲解決特殊問題而設計。
Hashtable
Hashtable與HashMap相似,Hashtable繼承自Dictionary類,實現了Map接口,不一樣的是它不容許記錄的鍵或者值爲空;和HashMap相比,Hashtable是線程同步的,即任一時刻只有一個線程能寫Hashtable,所以也致使了 Hashtable在寫入時會比較慢。並且Hashtable能夠經過Enumeration去遍歷。
四、總結
List按對象進入的順序保存對象,不作排序或編輯操做。
Set對每一個對象只接受一次,並使用本身內部的排序方法(一般,你只關心某個元素是否屬於Set,而不關心它的順序--不然應該使用List)。
Map一樣對每一個元素保存一份,但這是基於"鍵"的,Map也有內置的排序,於是不關心元素添加的順序。
若是添加元素的順序對你很重要,應該使用 LinkedHashSet/TreeSet或者LinkedHashMap/TreeMap.
最後還要提到集合類裏面一個很重要的類:Collections,它有不少本身獨特的靜態方法。固然它主要提供幾種特殊集合(List, Map,Set),能夠調用靜態方法來得到:Unmodifiable(不可修改集合,不可添加或刪除元素),Synchronize(保持同步集合,它的基本每一個方法都加鎖,防止併發操做),Checked(聲明之始傳入特定類型,之後的操做都會驗證加入元素是否屬於已定類型),Singleton(集合中只包含一個元素)。它們都是經過包裝集合類中的抽象類得到,產生不一樣的行爲。
推薦去個人博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
以爲不錯,別忘了點贊+轉發哦!