List、Set、Map的區別

蘇亦晨發表於2016-11-30

                                                                                               (圖一)

1.面試題:你說說collection裡面有什麼子類。

(其實面試的時候聽到這個問題的時候,你要知道,面試官是想考察List,Set)

正如圖一,list和set是實現了collection介面的。

 

(圖二)

List:1.可以允許重複的物件。

    2.可以插入多個null元素。

        3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。

        4.常用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最為流行,它提供了使用索引的隨意訪問,而 LinkedList 則對於經常需要從 List 中新增或刪除元素的場合更為合適。

 

 (圖三)

 Set:1.不允許重複物件

     2. 無序容器,你無法保證每個元素的儲存順序,TreeSet通過 Comparator  或者 Comparable 維護了一個排序順序。

        3. 只允許一個 null 元素

        4.Set 介面最流行的幾個實現類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基於 HashMap 實現的 HashSet;TreeSet 還實現了 SortedSet 介面,因此 TreeSet 是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器。

 

(圖四)

1.Map不是collection的子介面或者實現類。Map是一個介面。

2.Map 的 每個 Entry 都持有兩個物件,也就是一個鍵一個值,Map 可能會持有相同的值物件但鍵物件必須是唯一的。

3. TreeMap 也通過 Comparator  或者 Comparable 維護了一個排序順序。

4. Map 裡你可以擁有隨意個 null 值但最多隻能有一個 null 鍵。

5.Map 介面最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

 

 

2.面試題:什麼場景下使用list,set,map呢?

(或者會問為什麼這裡要用list、或者set、map,這裡回答它們的優缺點就可以了)

答:

  1. 如果你經常會使用索引來對容器中的元素進行訪問,那麼 List 是你的正確的選擇。如果你已經知道索引了的話,那麼 List 的實現類比如 ArrayList 可以提供更快速的訪問,如果經常新增刪除元素的,那麼肯定要選擇LinkedList。

  2. 如果你想容器中的元素能夠按照它們插入的次序進行有序儲存,那麼還是 List,因為 List 是一個有序容器,它按照插入順序進行儲存。

  3. 如果你想保證插入元素的唯一性,也就是你不想有重複值的出現,那麼可以選擇一個 Set 的實現類,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的實現類都遵循了統一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個 SortedSet,所有儲存於 TreeSet 中的元素可以使用 Java 裡的 Comparator 或者 Comparable 進行排序。LinkedHashSet 也按照元素的插入順序對它們進行儲存。

  4. 如果你以鍵和值的形式進行資料儲存那麼 Map 是你正確的選擇。你可以根據你的後續需要從 Hashtable、HashMap、TreeMap 中進行選擇。

大家可以跟著下面的步驟一起嘗試一下。

1.我們知道了列表要實現排序,需要重寫comparable介面的compareTo的方法。

但是是我不知道comparaTo裡面要怎麼寫呢,它有傳入引數嗎?它有返回值嗎?如果有事什麼型別的呢?ok,下面一起來做一下。先把這個連結的幫助文件下載下來。下載完之後,開啟幫助文件,

 

 

2.看完了幫助文件是不是心裡稍微有點底氣了呢,那現在開啟eclipse我們一起來寫一寫吧。

首先我們要比較物件的哪個屬性呢。年齡?身高?還是體重?剛剛看幫助文件已經知道了,所以下面大家一起來寫一下。

 如果大家也是像上圖這種寫法,那麼再想一想有沒有更好的辦法。(我這樣吻是肯定有的,好好看看幫助文件,你就知道了,我知道你只要用心想想,肯定想出來的!)

好了,寫完年齡,不去繼續花幾分鐘把按照身高來排序也寫一下吧。

相關文章