1. 程式人生 > >Set、List和Map的區別

Set、List和Map的區別

Set、List和Map是java容器框架的三個最重要的介面。

  • List提供了一個有序且有索引的容器,它允許重複值的出現。
  • Set提供了一個無序的唯一物件的容器,也就是說Set不允許重複值
  • Map提供了一個基於鍵值對以及雜湊的資料結構。

容器API裡都有很多現成的實現

  • List最常出現的實現類有ArrayList和LinkedList
  • Set最常出現的實現類有HashSet、LinkedHashSet和TreeSet
  • Map最常出現的實現類有HashMap、LinkedHashMap、Hashtable和TreeMap

Set vs List vs Map

前面提到了,Set、List和Map都是介面,它們定義了核心約束,比如一個Set約束說明了它不能包含重複值。下面我們就不同的指標對List、Set和Map進行對比。

1.重複物件

Java裡List和Set介面的最主要的區別就在於List允許有重複物件而Set不允許重複物件。所有的Set實現都必須遵循這一約束。Map的每個Entry都持有兩個物件都持有兩個物件,也就是一個鍵一個值,Map可能會持有相同的值物件但鍵物件必須是唯一的。

2.排序

List和Set的另一個關鍵區別是List是一個有序容器,List保持了每個元素的插入順序。Set是一無序容器,你無法保證每個元素的儲存順序。但是某些Set實現比如LinkedHashSet還是保持了每個元素的插入順序。此外SortedSet和SortedMap比如TreeSet和TreeMap也通過Comparator或者Comparable維護了一個排序順序。

3.空元素

List允許空元素,你可以在一個List裡同時擁有很多null物件——因為它還允許重複元素。由於不允許重複的限制,Set最多隻允許一個null元素。而Map裡你可以擁有隨意個null值但最多隻能有一個null值。值得注意的是Hashtable既不允許null鍵也不允許null值,但HashMap允許任意數量的null值和最多一個null鍵。

4.流行實現

  • List介面最流行的幾個實現類是ArrayList、LinkedList和Vector。ArrayList最為流行,它提供了使用索引的隨意訪問,而LinkedList則對於經常要從List中新增或刪除元素的場合更為合適。Vector是ArrayList的一個提供了同步功能的副本(功能上這樣講,但內部實現不是基於ArrayList實現)。
  • Set介面中最流行的幾個實現類是HashSet、LinkedHashSet以及TreeSet。其中HashSet不能提供任何排序保證,LinkedHashSet除了提供Set介面的唯一性之外還提供了元素的有序性,TreeSet實現了SortedSet介面,因此TreeSet是一個根據compare()和compareTo()的定義進行排序的有序容器。
  • Map介面最流行的幾個實現類是HashMap、LinkedHashMap、Hashtable和TreeMap。HashMap是Map介面的一個非同步的通用實現,Hashtable是HashMap的一個提供同步功能的副本(功能上這樣講,但內部實現不是基於ArrayList實現)。HashMap和Hashtable都不能像LinkedHashMap那樣做任何排序保證。類似於TreeSet,TreeMap也是一個有序的資料結構,它按照鍵的值進行升序排列。

Java裡什麼時候使用List、Set和Map?

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