iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0

如果你是使用Java,就不能不知道Collection與Map這兩個在Java中佔了舉足輕重的兩大資料型態了。

Collection是Java中提供用來處理進階資料結構的API,如果會了collection,在處理資料上來說真的真的真的會非常方便! (因為很重要所以說三次)

先來看一下Collection的架構,List、Set、Queue這三種介面均繼承Collection介面。其下含有ArrayList、HashSet、Dequeue等類別。

而Map則自己獨立成一個介面,其下含有HashMap、HashTable、TreeMap類別。

不同的類別其實具有不同的衍生特性,我們在處理資料時,可以依據我們的目的,或資料的特性來選擇對應的類別進行實作,舉例來說:

Collection

List – 希望收集時紀錄每個物件的索引順序

Set – 希望收集物件不重複

Queue – 以佇列方式收集物件,從後端插入物件,從前端取得物件。

Map

Map – 根據某個鍵值(key)取得對應的值(value)

https://ithelp.ithome.com.tw/upload/images/20200923/20128925LxaCNIaET5.png
圖片取自: https://liveoncode.com/java-collections-framework/

讓我們再來深入看一下List中的成員,ArrayList與LinkedList。

ArrayList的特性是,當ArrayList容量不足以容納全部元素時,ArrayList會自動擴張容量
並如陣列般,有順序的儲存元素,但與陣列不同的是,其允許元素重複,允許儲存 null 值。(陣列若無值會自動給0),另外,我們可以透過Collection的方法get()獲得元素及set()、add()為ArrayList給值,如下圖。
https://ithelp.ithome.com.tw/upload/images/20200923/20128925uaCTgJcU2v.png

再來看一下LinkedList,其以鏈結方式連結List中的元素,除了原本List有的方法可以使用之外,LinkedList增加了一些移除與插入物件的特定方法,像是addFirst()、addLast()、 getFirst()、getLast()、removeFirst( )、removeLast()等等。
https://ithelp.ithome.com.tw/upload/images/20200923/20128925GSVb6kmAsJ.png

而這兩個資料型態有哪裡不同呢?

ArrayList中的資料是以連續的方式儲存在記憶體,可支援隨機存取及循序存取,所以循序讀取或排序(sort)時的效能好。每個節點不用另外儲存下一個節點的指標,也因此,每個節點所占用的記憶體較少,但也因為是線性儲存於記憶體,所以在如果要對之中的元素進行插入或刪除節點等動作時效能較差,因為我們必須移動大量節點(當刪掉/新增一個元素,其他元素的位置都會被迫改變)。

LinkedList中的資料以不連續的方式儲存,因此不需使用連續的記憶體空間,每個節點都會記錄著下個節點的指標,所以在串列中插入或刪除節點時只需修改相關節點的指標,所以插入或刪除特定元素時的效能較好。但它的缺點是因非線性儲存,所以我們在讀取時無法快速索引到該節點(因為不知道位置),只能以循序存取讀取每一個節點的指標,所以讀取的效能較差。另外,因為每個元素還要儲存下一個元素的指標,因此占記憶體容量比較大。

結論就是,如果只需要讀取List中的元素或做排序,就使用ArrayList。若需要經常新增或刪除List中的元素,就使用LinkedList。

今天先講到這裡囉,明天會繼續Collection中的Set與Queue,以及非Collection的Map的介紹~


Hi, I am Grant.

個人部落格 - https://grantliblog.wordpress.com/
個人網站 - https://grantli-website.netlify.app/#/mainpage
我的寫作專題 - https://vocus.cc/user/5af2e9b5fd89780001822db4#


上一篇
Day9 - 繼承與多型
下一篇
Day11 - Collection 與 Map(續)
系列文
30天手把手帶你跟JAVA變成好朋友 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言