1. 程式人生 > >java集合-Set-List-Map

java集合-Set-List-Map

結構圖:

詳細好文:https://blog.csdn.net/weizhengzhou520/article/details/81806539

深度文章參考:http://www.cnblogs.com/eflylab/archive/2007/01/19/625086.html

深度文:https://blog.csdn.net/hellothejava/article/details/73457937

為什麼要使用集合類 ?

當你事先不知道要存放資料的個數,或者你需要一種比陣列下標存取機制更靈活的方法時,你就需要用到集合類。

 
理解集合類

集合類存放於java.util包中。
集合類存放的都是物件的引用,而非物件本身,出於表達上的便利,我們稱集合中的物件就是指集合中物件的引用(reference)。
集合型別主要有3種:set(集)、list(列表)和map(對映)。

 

(1)集(set)
集(set)是最簡單的一種集合,它的物件不按特定方式排序,只是簡單的把物件加入集合中,就像往口袋裡放東西。
對集中成員的訪問和操作是通過集中物件的引用進行的,所以集中不能有重複物件。
集也有多種變體,可以實現排序等功能,如TreeSet,它把物件新增到集中的操作將變為按照某種比較規則將其插入到有序的物件序列中。它實現的是SortedSet介面,也就是加入了物件比較的方法。通過對集中的物件迭代,我們可以得到一個升序的物件集合。

(2)列表(list)
列表的主要特徵是其物件以線性方式儲存,沒有特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。
列表在資料結構中分別表現為:陣列和向量、連結串列、堆疊、佇列。
關於實現列表的集合類,是我們日常工作中經常用到的,將在後邊的筆記詳細介紹。

(3)對映(map)
對映與集或列表有明顯區別,對映中每個項都是成對的。對映中儲存的每個物件都有一個相關的關鍵字(Key)物件,關鍵字決定了物件在對映中的儲存位置,檢索物件時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。
關鍵字本身並不能決定物件的儲存位置,它需要對過一種雜湊(hashing)技術來處理,產生一個被稱作雜湊碼(hash code)的整數值,雜湊碼通常用作一個偏置量,該偏置量是相對於分配給對映的記憶體區域起始位置的,由此確定關鍵字/物件對的儲存位置。理想情況下,雜湊處理應該產生給定範圍內均勻分佈的值,而且每個關鍵字應得到不同的雜湊碼。

例子:

在使用Java的時候,我們都會遇到使用集合(Collection)的時候,但是Java API提供了多種集合的實現。

總的說來,Java API中所用的集合類,都是實現了Collection介面,他的一個類繼承結構如下:

                  Collection<--List<--Vector
                  Collection<--List<--ArrayList
                  Collection<--List<--LinkedList
                  Collection<--Set<--HashSet
                  Collection<--Set<--HashSet<--LinkedHashSet
                  Collection<--Set<--SortedSet<--TreeSet

Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能不受Array的限制。效能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector        :sychronized”的,這個也是Vector和ArrayList的唯一的區別。

ArrayList:同Vector一樣是一個基於Array上的連結串列,但是不同的是ArrayList不是同步的。所以在效能上要比Vector優越一些,但是當執行到多執行緒環境中時,可需要自己在管理執行緒的同步問題。

LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array效能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的資料(data);2.下一個節點的資訊(nextNode)。所以當對LinkedList做新增,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的資料移動。只要更改nextNode的相關資訊就可以實現了。這就是LinkedList的優勢。

List總結:

1. 所有的List中只能容納單個不同型別的物件組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];

2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];

3. 所有的List中可以有null元素,例如[ tom,null,1 ];

4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(連結串列)適合新增,刪除操作。

HashSet:雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的儲存方式是把HashMap中的Key作為Set的對應儲存項。看看HashSet的add(Object  obj)方法的實現就可以一目瞭然了。
    public boolean add(Object obj)
    {
        return map.put(obj, PRESENT) == null;
    }

這個也是為什麼在Set中不能像在List中一樣有重複的項的根本原因,因為HashMap的key是不能有重複的。

LinkedHashSet:HashSet的一個子類,一個連結串列。

TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。

Set總結:

1. Set實現的基礎是Map(HashMap);

2.  Set中的元素是不能重複的,如果使用add(Object obj)方法新增已經存在的物件,則會覆蓋前面的物件