java中List、Set、Map之間的關係
java中關於實現陣列有許多種方法,諸如ArrayList,Hashmap,Linklist....此類太多的陣列型別實在是讓人暈頭轉向,很難掌握其要點.今天我就帶大家來整理一下List,set,map之間的區別和聯絡:
首先說明一下他們之間所有的所屬關係:
1.Collection介面之下有List和Set兩個介面
List介面:以特定順序儲存
List的實現類:ArrayList、LinkList、Vector
Set介面:不能包含重複的元素
List的實現類:HashSet、TreeSet
2.Map介面
HashMap、HashTable、TreeMap
分別講解
一,Conllection:
接下來先看一下Collection介面:
他有兩個子介面,Set和List,
1,Set(公共特點;無序)
是一個無序的集合介面,並且元素不可重複,當然,這裡的無序是針對放入順序而言,並不是絕對的無序,他有兩個子類,一個是hashSet,還有一個是繼承了SortedSet介面的TreeSet,這兩個set集合有什麼特點呢?
首先,hashSet的底層是hashmap,他有著hashmap中鍵的特性,那就是,無序,不可重複性,
其次,treeset實現了sortset介面,sortedset有排序能力,也就意味著treeset也有著排序的能力,他是使用二叉樹進行排序的。
2,list(有序):
list介面也有兩個子類,一個是arraylist,一個是linkedList,
首先arralist的底層是object[]是一個數組,也就意味著他有著陣列的特性,但是和陣列相比他比陣列靈活,無需設定長度,他是有序的,所以查詢塊,增刪比較慢,
和arralist其實有一個兄弟叫vector,他和arralist是一樣的
Vector是執行緒安全的,也就是說是它的方法之間是執行緒同步的,而arralist執行緒是非同步的也就是說他是不安全的,但是效率高,相比之下,建議使用arralist.,
linkedlist:
他底層是以連結串列的形式進行排序的,兩個元素之間就如同鏈子一樣前關聯,如果進行增刪操作的時候,只需要將某個元素替換然後將後邊的關聯簡單修改就可以完成,所以說建議查詢用arralist,增刪用linkedlist;
二,map(公共特點特點:以鍵值對的形式儲存,):
簡單來講常用的map類的集合也有三個,常用的有三個子類實現了mapj介面:map存在的意義就是為了快速查詢,通過鍵的直接找到值,因為鍵是不可重複的。
1,hashMap和hashtable:
兩者放在一起比較(底層都是hash表結構):hashmap執行緒是不安全的允許鍵值對為null,二hashtable執行緒是安全的不允許鍵值對為null,兩者的其他屬性是一樣的,所以兩者的使用要看具體的情況而定,
2,treemap(底層是二叉樹),執行緒不同步,可用於給Map集合中的鍵進行排序.
Java 裡什麼時候使用 List、Set 和 Map?
基於以上我們對 Set、List 和 Map 的理解,現在我們可以決定什麼時候使用 List、Set 還是 Map 了。
- 如果你經常會使用索引來對容器中的元素進行訪問,那麼 List 是你的正確的選擇。如果你已經知道索引了的話,那麼 List 的實現類比如 ArrayList 可以提供更快速的訪問。
- 如果你想容器中的元素能夠按照它們插入的次序進行有序儲存,那麼還是 List,因為 List 是一個有序容器,它按照插入順序進行儲存。
- 如果你想保證插入元素的唯一性,也就是你不想有重複值的出現,那麼可以選擇一個 Set 的實現類,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的實現類都遵循了統一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個 SortedSet,所有儲存於 TreeSet 中的元素可以使用 Java 裡的 Comparator 或者 Comparable 進行排序。LinkedHashSet 也按照元素的插入順序對它們進行儲存。
- 如果你以鍵和值的形式進行資料儲存那麼 Map 是你正確的選擇。你可以根據你的後續需要從 Hashtable、HashMap、TreeMap 中進行選擇