說說List,Set,Map三者的區別?
List(對付順序的好幫手)有序集合,允許有相同的元素。
Set(注重獨一無二的性質)無序集合,不允許相同元素。
Map(用Key來搜索的專家): 使用鍵值對存儲,不允許相同的鍵。
Collection > list set map
Collection 接口
boolean containsAll(Collection c) 判斷集合中是否 包含 集合 c 中的所有元素
boolean isEmpty() 判斷集合是否為 空
boolean removeAll(Collection c) 從集合中刪除所有在集合 c 中出現的元素
Object[] toArray() 返回包含此集合中所有元素的數組
list ArrayList,LinkedList (不同步,都是線程不安全)
ArrayList 采用數組存儲, 插入和刪除元素的時間復雜度受元素位置的影響(List list = new ArrayList(); // 創建集合)
LinkedList 采用鏈表存儲, 插入和刪除元素時間復雜度不受元素位置的影響(LinkedList<String> products = new LinkedList<String>(); // 創建集合對象)
隨機訪問, LinkedList 不支持高效的隨機元素訪問,而 ArrayList 支持
set HashSet,TreeSet
HashSet (無序,唯一)基於 HashMap 實現的(HashSet<String> bookSet = new HashSet<String>(); // 創建一個空的 Set 集合)集合中添加兩個相同的元素,則后添加的會覆蓋前面添加的元素
TreeSet (有序,唯一)紅黑樹(自平衡的排序二叉樹) (TreeSet<Double> scores = new TreeSet<Double>(); // 創建 TreeSet 集合)
LinkedHashSet LinkedHashSet 繼承於 HashSet
map HashMap,TreeMap
HashMap 由數組+鏈表組成的,而 TreeMap 類可以對鍵對象進行排序。
TreeMap 紅黑樹(自平衡的排序二叉樹),唯一不同的是 TreeMap 類可以對鍵對象進行排序
LinkedHashMap LinkedHashMap 繼承自 HashMap,
Hashtable 數組+鏈表組成的,數組是 HashMap 的主體
HashMap 和 Hashtable 區別:
線程是否安全: HashMap 是非線程安全的, HashTable 是線程安全的;HashTable 內部的方法基本都經過synchronized 修飾 證線程安全的話就使用 Concurrent HashMap
鍵,或值是否為空: HashMap 支持, HashTable 不支持
初始容量大小和每次擴充容量大小的不同:
HashMap ,解決哈希沖突,當鏈表長度大於閾值(默認為8)時,將鏈表轉化為紅黑樹
HashMap 和 HashSet 區別:
HashSet 底層就是基於 HashMap 實現的。
實現不同的接口, 一個是 map 接口 ,一個是 set 接口。
存儲 鍵值對, set 是存儲對象
map 用 put 方法存。 set 用 add 方法存。
HashMap 底層實現:
底層是 數組和鏈表 結合在一起使用。創建一個鏈表數組, jdk1.8 以后。 當鏈表長度大於閾值(默認為8)時,將鏈表轉化為紅黑樹,以減少搜索時間。
紅黑樹:?
多線程情況下使用 ConcurrentHashMap
如何選用集合?
需要根據 鍵值獲取到元素值時就選用Map接口下的集合,需要排序時選擇 TreeMap,不需要排序時就選擇 HashMap, 需要保證 線程安全就選用 Concurrent HashMap.
當我們只需要存放元素值時,就選擇實現 Collection 接口的集合,需要保證 元素唯一時選擇實現Set接口的集合比如 TreeSet 或 HashSet ,
不需要就選擇實現List接口的比如ArrayList或LinkedList,