1. 程式人生 > >List,Set,Map的聯絡和區別

List,Set,Map的聯絡和區別

要說清楚list,set,map的區別,大家先看一下這段話,我覺得相當有趣,當然這是別人的話,這裡引用一下。

世間上本來沒有集合,(只有陣列參考C語言)但有人想要,所以有了集合
有人想有可以自動擴充套件的陣列,所以有了List
有的人想有沒有重複的陣列,所以有了set
有人想有自動排序的組數,所以有了TreeSet,TreeList,Tree**
而幾乎有有的集合都是基於陣列來實現的.
因為集合是對陣列做的封裝,所以,陣列永遠比任何一個集合要快
但任何一個集合,比陣列提供的功能要多
一:陣列聲明瞭它容納的元素的型別,而集合不宣告。這是由於集合以object形式來儲存它們的元素。
二:一個數組例項具有固定的大小,不能伸縮。集合則可根據需要動態改變大小。
三:陣列是一種可讀/可寫資料結構---沒有辦法建立一個只讀陣列。然而可以使用集合提供的ReadOnly方法,以只讀方式來使用集合。該方法將返回一個集合的只讀版本

所以陣列就不再說了,那咱們就說一下,既然我們在資料張有了升級(集合),而且還出了基於Collection的那麼多的子類,我們今天就好好的區分一下List,Set,Map三者之間區別和聯絡吧。

Set

set是三者中最簡單的集合,他的儲存是沒有順序的(其實是有的,是億靠hashCode來確定的),他裡邊的內容和我們儲存順序沒有直接的關係,而且set裡邊的物件不能重複。所以要加入set的物件一定要判斷他們是否已經重複了。
1. HashSet : 為快速查詢設計的Set。存入HashSet的物件必須定義hashCode()。
2. TreeSet : 儲存次序的Set, 底層為樹結構。使用它可以從Set中提取有序的序列。
3. LinkedHashSet :具有HashSet的查詢速度,且內部使用連結串列維護元素的順序(插入的次序)。於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。

    Set set=new HashSet();   
    String s1=new String("hello");    
    String s2=s1;  
    String s3=new String("world");  
    set.add(s1);  
    set.add(s2);  
    set.add(s3);  
    System.out.println(set.size());//列印集合中物件的數目 為 2。  

Map

map是一個鍵值對對映的集合,他每次儲存一個物件的時候,都需要為該物件存一個key,例如map.put(“123”,”menghaibin”)。而我們取值的時候也只需要取利用key,就能返回我們需要的物件。
常用方法如下:

    Object put(Object key, Object value): 向集合中加入元素   
    Object remove(Object key): 刪除與KEY相關的元素    
    void clear():從映像中刪除所有對映   

而java類庫中包含了幾種不同的map:HashMap,LinkedHashMap,TreeMap, IdentifyHashMap這幾種Map,他們的區別和聯絡又是什麼呢:
4. HashMap : Map基於散列表的實現。插入和查詢“鍵值對”的開銷是固定的。
5. LinkedHashMap :
類似於HashMap,但是迭代遍歷它時,取得“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用連結串列維護內部次序。
6. TreeMap :
基於紅黑樹資料結構的實現。檢視“鍵”或“鍵值對”時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。

List

List按物件進入的順序儲存物件,不做排序或編輯操作,容許他們有重複物件,LinkedList,ArrayList,Vector 。
1. LinkedList:底層基於連結串列實現,連結串列記憶體是散亂的,每一個元素儲存本身記憶體地址的同時還儲存下一個元素的地址。連結串列增刪快,查詢慢
2. ArrayList和Vector的區別:ArrayList是非執行緒安全的,效率高;Vector是基於執行緒安全的,效率低.

    List list = new ArrayList();
    list.add("zhangsan");
    list.add("lisi");
    for(int i=0; i<list.size();i++){  
        System.out.println(list.get(i));  
    }