集合是 java 基礎中很是重要的一部分,一樣也是 Java 面試中很重要的一個知識點。因此,給王小整理了這篇關於集合的文章。java
集合類存放於 Java.util 包中,主要有 3 種:set、list 和 map。面試
層次關係圖:數組
Java 的 List 是很是經常使用的數據類型。List 是有序的 Collection。Java List 一共三個實現類:分別是 ArrayList、Vector 和 LinkedList。安全
ArrayList 是最經常使用的 List 實現類,內部是經過數組實現的,它容許對元素進行快速隨機訪問。數組的缺點是每一個元素之間不能有間隔,當數組大小不知足時須要增長存儲能力,就要將已經有數組的數據複製到新的存儲空間中。當從 ArrayList 的中間位置插入或者刪除元素時,須要對數組進行復制、移動、代價比較高。所以,它適合隨機查找和遍歷,不適合插入和刪除。微信
Vector 與 ArrayList 同樣,也是經過數組實現的,不一樣的是它支持線程的同步,即某一時刻只有一個線程可以寫 Vector,避免多線程同時寫而引發的不一致性,但實現同步須要很高的花費,所以,訪問它比訪問 ArrayList 慢。多線程
LinkedList 是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了 List 接口中沒有定義的方法,專門用於操做表頭和表尾元素,能夠看成堆棧、隊列和雙向隊列使用。併發
Set 注重獨一無二的性質,該體系集合用於存儲無序(存入和取出的順序不必定相同)元素,值不能重複。對象的相等性本質是對象 hashCode 值(java 是依據對象的內存地址計算出的此序號)判斷的,若是想要讓兩個不一樣的對象視爲相等的,就必須覆蓋 Object 的 hashCode 方法和 equals 方法。java Set 一共三個實現類:分別是 HashSet、TreeSet 和 LinkHashSet。app
哈希表邊存放的是哈希值。HashSet 存儲元素的順序並非按照存入時的順序(和 List 顯然不一樣) 而是按照哈希值來存的因此取數據也是按照哈希值取得。元素的哈希值是經過元素的hashcode 方法來獲取的, HashSet 首先判斷兩個元素的哈希值,若是哈希值同樣,接着會比較equals 方法 若是 equls 結果爲 true ,HashSet 就視爲同一個元素。若是 equals 爲 false 就不是同一個元素。函數
哈希值相同 equals 爲 false 的元素是怎麼存儲呢,就是在一樣的哈希值下順延(能夠認爲哈希值相同的元素放在一個哈希桶中)。也就是哈希同樣的存一列。如圖 1 表示 hashCode 值不相同的狀況;圖 2 表示 hashCode 值相同,但 equals 不相同的狀況。spa
HashSet 經過 hashCode 值來肯定元素在內存中的位置。一個 hashCode 位置上能夠存放多個元素。
對於 LinkedHashSet 而言,它繼承與 HashSet、又基於 LinkedHashMap 來實現的。
LinkedHashSet 底層使用 LinkedHashMap 來保存全部元素,它繼承與 HashSet,其全部的方法操做上又與 HashSet 相同,所以 LinkedHashSet 的實現上很是簡單,只提供了四個構造方法,並經過傳遞一個標識參數,調用父類的構造器,底層構造一個 LinkedHashMap 來實現,在相關操做上與父類 HashSet 的操做相同,直接調用父類 HashSet 的方法便可。
HashMap 根據鍵的 hashCode 值存儲數據,大多數狀況下能夠直接定位到它的值,於是具備很快的訪問速度,但遍歷順序倒是不肯定的。 HashMap 最多隻容許一條記錄的鍵爲 null,容許多條記錄的值爲 null。HashMap 非線程安全,即任一時刻能夠有多個線程同時寫 HashMap,可能會致使數據的不一致。若是須要知足線程安全,能夠用 Collections 的 synchronizedMap 方法使HashMap 具備線程安全的能力,或者使用 ConcurrentHashMap。
Hashtable 是遺留類,不少映射的經常使用功能與 HashMap 相似,不一樣的是它承自 Dictionary 類,
而且是線程安全的,任一時間只有一個線程能寫 Hashtable,併發性不如 ConcurrentHashMap,
由於 ConcurrentHashMap 引入了分段鎖。Hashtable 不建議在新代碼中使用,不須要線程安全
的場合能夠用 HashMap 替換,須要線程安全的場合能夠用 ConcurrentHashMap 替換。
TreeMap 實現 SortedMap 接口,可以把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,
也能夠指定排序的比較器,當用 Iterator 遍歷 TreeMap 時,獲得的記錄是排過序的。
若是使用排序的映射,建議使用 TreeMap。
LinkedHashMap 是 HashMap 的一個子類,保存了記錄的插入順序,在用 Iterator 遍歷LinkedHashMap 時,先獲得的記錄確定是先插入的,也能夠在構造時帶參數,按照訪問次序
一、三者之間的區別
二、List 三個子類的區別
三、map 三個子類的區別
四、set 兩個子類的區別
若是文章有錯的地方歡迎指正,你們互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:niceyoo