Java集合List、Set、Map
集合是 java 基礎中非常重要的一部分,同樣也是 Java 面試中很重要的一個知識點。所以,給王小整理了這篇關于集合的文章。
1、接口繼承關系以及實現
集合類存放于 Java.util 包中,主要有 3 種:set、list 和 map。
- Collection:Collection 是集合 List、Set、Queue 的最基本的接口
- Iterator:迭代器,可以通過迭代器遍歷集合中的數據
- Map:是映射表的基礎接口
層次關系圖:
2、List
Java 的 List 是非常常用的數據類型。List 是有序的 Collection。Java List 一共三個實現類:分別是 ArrayList、Vector 和 LinkedList。
2.1、ArrayList
ArrayList 是最常用的 List 實現類,內部是通過數組實現的,它允許對元素進行快速隨機訪問。數組的缺點是每個元素之間不能有間隔,當數組大小不滿足時需要增加存儲能力,就要將已經有數組的數據復制到新的存儲空間中。當從 ArrayList 的中間位置插入或者刪除元素時,需要對數組進行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。
2.2、Vector
Vector 與 ArrayList 一樣,也是通過數組實現的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠寫 Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問 ArrayList 慢。
2.3、LinkList
LinkedList 是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了 List 接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。
3、Set
Set 注重獨一無二的性質,該體系集合用于存儲無序(存入和取出的順序不一定相同)元素,值不能重復。對象的相等性本質是對象 hashCode 值(java 是依據對象的內存地址計算出的此序號)判斷的,如果想要讓兩個不同的對象視為相等的,就必須覆蓋 Object 的 hashCode 方法和 equals 方法。java Set 一共三個實現類:分別是 HashSet、TreeSet 和 LinkHashSet。
3.1、HashSet
哈希表邊存放的是哈希值。HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數據也是按照哈希值取得。元素的哈希值是通過元素的hashcode 方法來獲取的, HashSet 首先判斷兩個元素的哈希值,如果哈希值一樣,接著會比較equals 方法 如果 equls 結果為 true ,HashSet 就視為同一個元素。如果 equals 為 false 就不是同一個元素。
哈希值相同 equals 為 false 的元素是怎么存儲呢,就是在同樣的哈希值下順延(可以認為哈希值相同的元素放在一個哈希桶中)。也就是哈希一樣的存一列。如圖 1 表示 hashCode 值不相同的情況;圖 2 表示 hashCode 值相同,但 equals 不相同的情況。
HashSet 通過 hashCode 值來確定元素在內存中的位置。一個 hashCode 位置上可以存放多個元素。
3.2、TreeSet
3.3、LinkHashSet
對于 LinkedHashSet 而言,它繼承與 HashSet、又基于 LinkedHashMap 來實現的。
LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法操作上又與 HashSet 相同,因此 LinkedHashSet 的實現上非常簡單,只提供了四個構造方法,并通過傳遞一個標識參數,調用父類的構造器,底層構造一個 LinkedHashMap 來實現,在相關操作上與父類 HashSet 的操作相同,直接調用父類 HashSet 的方法即可。
4、Map
4.1、HashMap
HashMap 根據鍵的 hashCode 值存儲數據,大多數情況下可以直接定位到它的值,因而具有很快的訪問速度,但遍歷順序卻是不確定的。 HashMap 最多只允許一條記錄的鍵為 null,允許多條記錄的值為 null。HashMap 非線程安全,即任一時刻可以有多個線程同時寫 HashMap,可能會導致數據的不一致。如果需要滿足線程安全,可以用 Collections 的 synchronizedMap 方法使HashMap 具有線程安全的能力,或者使用 ConcurrentHashMap。
4.2、HashTable
Hashtable 是遺留類,很多映射的常用功能與 HashMap 類似,不同的是它承自 Dictionary 類,
并且是線程安全的,任一時間只有一個線程能寫 Hashtable,并發性不如 ConcurrentHashMap,
因為 ConcurrentHashMap 引入了分段鎖。Hashtable 不建議在新代碼中使用,不需要線程安全
的場合可以用 HashMap 替換,需要線程安全的場合可以用 ConcurrentHashMap 替換。
#####4.3、TreeMap
TreeMap 實現 SortedMap 接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,
也可以指定排序的比較器,當用 Iterator 遍歷 TreeMap 時,得到的記錄是排過序的。
如果使用排序的映射,建議使用 TreeMap。
4.4、LinkHashMap
LinkedHashMap 是 HashMap 的一個子類,保存了記錄的插入順序,在用 Iterator 遍歷LinkedHashMap 時,先得到的記錄肯定是先插入的,也可以在構造時帶參數,按照訪問次序
5、總結
1、三者之間的區別
- list 有序、可以重復,有三個實現類,ArrayList、linkedList、Vector
- set 無序、不可重復,有兩個實現類,HashSet、LinkedhashSet
- map 鍵不可以重復、值可以重復,有三個實現類,HashMap、HashTable、LinkedHashMap
2、List 三個子類的區別
- ArrayList:底層使用object[]數組實現,內存地址都是連續的便于索引,查詢快;在新增的時候需要申請一塊連續的內存空間,所以增刪比較慢。
- LinkedList: 底層是基于鏈表實現,鏈表內存是散亂的,在儲存自身內存地址的
同時,還儲存著下一個元素的內存地址,所以查詢慢,增刪快。 - Vector:底層數組實現,由于所有的方法都是采用synchronize,線程安全,效率慢。
3、map 三個子類的區別
- HashMap:基于hash表的Map接口實現,非線程安全,支持鍵null、值null
- HashTab:線程安全,不支持鍵null,值null
- LinkedHashMap:持兩種排序:插入順序、訪問順序。前者是指按照插入時的順序排序,后者是指按照最舊使用到最近使用的順序
4、set 兩個子類的區別
- HashSet:底層由HashMap實現
- LinkedHashSet:LinkedHashSet 繼承自 HashSet,源碼更少、更簡單,唯一的區別是 LinkedHashSet 內部使用的是 LinkHashMap。這樣做的意義或者好處就是 LinkedHashSet 中的元素順序是可以保證的,也就是說遍歷序和插入序是一致的
如果文章有錯的地方歡迎指正,大家互相留言交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:niceyoo
總結
以上是生活随笔為你收集整理的Java集合List、Set、Map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java笔试题算法题,吐血整理
- 下一篇: nachos中文教程java_Nacho