集合---Set、List、Map的區別

Set、List和 Map 的區別

Set 、List 和 Map 是 Java 容器框架的三個最重要的接口。

  • List 提供了一個有序且有索引的容器,它允許重複值的出現。
  • Set 提供了一個無序的唯一對象的容器,Set 不允許重複值。
  • Map 提供的則是一個基於鍵值對以及哈希的數據結構(key-value)。

List、Set 和 Map 這三個都是 Java 裏的接口,在容器 API 裏都有很多現成的實現。

  • ArrayList 和 LinkedList 是兩個最常使用的 List 實現;

  • LinkedHashSet、TreeSet 和 HashSet 則是最常用的 Set 實現;

  • HashMap、LinkedHashMap、TreeMap、Hashtable是Map的常用實現;

  • 比較:

Set List Map
數據重複 不允許 允許 鍵必須唯一,值可以重複
有序性 無序容器,無法保證每個元素的存儲順序,有些Set實現了插入有序,如LinkedHashSet,此外 SortedSet 和 SortedMap,比如 TreeSet 和 TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。 保持了每個元素的插入順序 HashMap(插入無序),LinkedHashMap(插入有序)
Null值 只有一個值爲null 允許 只能有一個null鍵,可以有多個null值
Hashtable不允許null鍵,也不允許null值;HashMap允許一個null鍵和多個null值
常用實現類及特點 HashSet、LinkedHashSet、TreeSet
(1)HashSet 也不能提供任何排序保證;(基於 HashMap 實現的 HashSet)
(2)LinkedHashSet 卻除了提供 Set 接口的唯一性之外還提供了元素的有序性;
(3)TreeSet 還實現了 SortedSet 接口,因此 TreeSet 是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器;
ArrayList、LinkedList、Vector
(1)ArrayList 最爲流行,它提供了使用索引的隨意訪問;
(2)LinkedList 則對於經常需要從 List 中添加或刪除元素的場合;
(3)更爲合適Vector 是 ArrayList 的一個提供了同步功能的副本(功能上這樣講,但內部實現不是基於 ArrayList 實現)
HashMap、LinkedHashMap、Hashtable、TreeMap
(1)HashMap 是 Map 接口的一個非同步的通用實現;
(2)Hashtable 是 HashMap 的一個提供了同步功能的副本;
(3)HashMap 和 Hashtable 都不能像 LinkedHashMap 那樣做任何排序保證。
(4)TreeMap 也是一個有序的數據結構,它按照鍵的值進行升序排列。

Java 裏什麼時候使用 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 中進行選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章