1. 程式人生 > >java中List、Set、Map之間的關係

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 了。

  1. 如果你經常會使用索引來對容器中的元素進行訪問,那麼 List 是你的正確的選擇。如果你已經知道索引了的話,那麼 List 的實現類比如 ArrayList 可以提供更快速的訪問。
  2. 如果你想容器中的元素能夠按照它們插入的次序進行有序儲存,那麼還是 List,因為 List 是一個有序容器,它按照插入順序進行儲存。
  3. 如果你想保證插入元素的唯一性,也就是你不想有重複值的出現,那麼可以選擇一個 Set 的實現類,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的實現類都遵循了統一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個 SortedSet,所有儲存於 TreeSet 中的元素可以使用 Java 裡的 Comparator 或者 Comparable 進行排序。LinkedHashSet 也按照元素的插入順序對它們進行儲存。
  4. 如果你以鍵和值的形式進行資料儲存那麼 Map 是你正確的選擇。你可以根據你的後續需要從 Hashtable、HashMap、TreeMap 中進行選擇