close

Collection

Collection在JAVA的基礎中是非常重要的部份,它會佔了一整個章節,而Collection主要的內容如下圖:

 

我們在下方大概的解釋一下每個相應的Class。

List、ArrayList、LinkedList

首先介紹的是List、ArrayList、LinkedList這三組。基本上List這一類的Class,跟Array很類似,List上跟Array不同的是,Array需要提前知道長度,List不需要。

而List是一個Interface,而ArrayList與LinkedList是實作的Class。所以通常宣告時,會搭配物件導向的多型方式宣告如下:

ArrayList與LinkedList的差別

ArrayList與LinkedList都是實作List的Class,所以List有的功能,ArrayList與LinkedList全都有;而這二個List的差別在於,尋找下一節點的位置與切換下一個節點的位置。

假設今天有三個Object在heap中,分別利用ArrayList與LinkedList儲存,則結果如下圖:

此時因為ArrayList是照順序儲存的,所以在取得特定的index元素時,非常方便快速,而LinkedList在取得特定的index元素,因為要一個一個去取,所以會比較慢。

假設今天要插入第四個Object A,而且要接續在Object 1之後,所以會變成:

我們可以看到ArrayList的Object 2與Object 3都被移位了,而LinkedList則是修改Object 1的指向,再由Object A的指向Object 2,所以修改了二個指向,如果今天List內的數量很多,ArrayList會影響到被插入的index後的每一個,而LinkedList只會影響到二個。

結論

 

 

ArrayList

LinkedList

找特定index值

可以快速找到。

因為需要一個接續一個地找,所以比較慢。

插入中間值

影響中間index之後的每一個值,所以執行時間較久。

只影響二個指向,所以較快。

 

Set、HashSet、TreeSet

Set與List其實是很類似的東西,不過它們之間最大的區別在於,Set的內容不準重覆,不過List可以。

下圖是一List與Set的範例:

Set因為有著不能重覆的特性,而判斷重覆的基準是根據Object的equals()來判斷;另外Set的內容因為不能重覆,所以會有排序的問題,而排序的考量有二點:

  1. 使用者自訂排序 → TreeSet

  2. 快速取出 → HashSet

TreeSet預設為ASCII的方式排序,不過使用者也可以讓物件實作java.lang.Comparable,客製化排序;而HashSet則是根據Object的hash()來決定先後順序。

*注意:List在取出時是有順序的,但是Set在取出時,是會根據排序後的順序,請注意,下圖是範例:

Stack(先進後出)與Queue(先進先出)

Stack與List是很類似的東西,都是將一堆資料塞進去裡面後,再慢慢取出來;不過它們有Stack與Queue有它們自己的特性,Stack是先進後出(LIFO),而Queue是先進先出(FIFO),我們直接來看範例:

下圖是Stack的範例:

下圖是Queue的範例:

Stack與Queue的peek()

Stack與Queue都是在取出內容物後,就將該物件從Stack或Queue中移除了,所以為了因應各種狀況,所以在Stack或Queue中都有提供對應的Method peek(),這個Method取出來的物件與Stack的pop()與Queue的poll()是相同的,不過它不會將物件從Stack或Queue中移除。

Map、HashMap、TreeMap

Map是一種方便使用者儲放key、Value的一種集合,而且它也很接近Set與List的集合體,儲放key時使用Set,儲放Value時使用List。

Map的Key是使用Set的方式儲存的,所以Key是不能重覆的,而Value是用List的方式儲存,所以Value是可以重覆的。

而Map中的Key因為使用Set的方式儲存,所以跟Set一樣,Set有HashSet、TreeSet,而Map則有HashMap與TreeMap,主要都是針對Key的部份。

arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(1) 人氣()