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的內容因為不能重覆,所以會有排序的問題,而排序的考量有二點:
-
使用者自訂排序 → TreeSet
-
快速取出 → 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的部份。
留言列表