Java 資料結構,在大學、研究所時期資訊相關的學生必學的一門課,也是研究所必考的一科。學好這門學科非常重要,乃至於影響到出社會找工作,想要當社畜攻城獅必備的一項技能。
如同前言說的,資料結構非常的重要,那到底是什麼原因呢?你可能會覺得,想要當一個碼農埋頭苦幹的寫程式就對了,沒有什麼功能是熬夜個幾天做不出來的,如果有,那就再熬一次夜。
這個功能確實是被做出來了,但是使用不對的資料結構,不僅在維護上很麻煩,更嚴重可能會碰到效能的瓶頸。
有什麼資料結構
資料結構主要可以分為兩種形態,一種是原始資料結構 (Primitive Data Structure),一種是非原始資料結構(Non-Primitive Data Structure)。
原始資料結構
原始資料結構是程式語言定義好最基本單位的資料結構,例如 integer、float、char、double、boolean、byte、short,這類結構都是屬於原始資料結構,也稱之為原始型別(Primitive Type),這些資料結構都做非常簡單的事情,例如用來儲存數字、儲存字元、儲存布林值。
非原始資料結構
非原始資料結構是使用原始資料結構搭建起來的資料結構,例如 Array、Stack、Queue、LinkedList、Tree、Graph,舉例來說Array可以把一連串的數字儲存起來。在 java中我們使用 [ ] 來將變數宣告成一個 array。如下程式碼所示,intArray 就是由 10 個可以儲存 integer 空間所組成的陣列(Array)。
int[] intArray = new int[10];
intArray[0] = 1;
intArray[1] = 5;
而這次一系列教學的是java程式設計中極其常見的非原始資料結構,包含 Set、List、Qeueu與Map 這四類,教學會把這些資料結構的機制與使用方法詳細的說明。這四類資料結構都是java.util.* 原生類別。其中 Set、List、Queue 這三類的資料結構源自於 java.util.Collection 這個 interface;而 Map這類的資料結構源自於 java.util.Map 這個 interface。下圖是以UML 的 Class Model 來描述幾個相當重要的實作。
綠色螢光筆框起來的類別就是這一系列資料結構專題會特別詳細教學的 Class。另外一個需要解釋的是這張圖究竟是怎麼來的,這些方塊跟線又是什麼意思呢?這裡先稍微帶到一下,未來也會針對 UML 做詳細的說明。
一個方塊代表的就是一個 interface(介面)、或者是 Class (類別),實體線箭頭則代表 繼承(Inheritance),虛擬線箭頭則代表實作(Implement),這些有什麼差別呢?我們等到Java 物件導向 OOP 的教學會在詳細的說明。
上圖則是 Map 這個家族的 UML Class Diagram,我們將會專注在 HashMap、LinkedHashMap、TreeMap 與 HashTable 的詳細解說。這兩張圖非常的重要,可以說是在寫程式必須要能熟悉的兩張圖。
這麼多資料結構到底怎麼使用
我一些常用的資料結構各自不同的特性整理成一個表格,接下來在後續的文章會針對每一個資料結構進行解析、包含程式碼與實作特性。而這個表格與前面兩張UML 圖都非常重要,可以的話可以先把這三張圖抓下來保存。
這張表格的欄位介紹如下
第一欄代表這是哪一個資料結構的介面,一開始有提到 java.util.* package內有四個主要的介面 Set、List、Queue、Map。
第二欄代表實作的類別;
第三欄代表這個資料結構是否支援 Key-Value Pair的結構,也就是儲存資料的時候同時儲存 Key與Value兩種資料,聰明的大家一看就知道,只有 Map這個結構可以儲存 Key-Value的結構,什麼時候會需要用到這樣的結構呢?舉例來說課程代號與名稱對應的資料結構就可以使用到 Key-Value。
第四欄代表儲存的 item能否重複,舉例來說我要儲存一連串數字 3,4,5,6,4,此時4是重複的這樣儲存時是儲存 3,4,5,6,4 還是 3,4,5,6 這樣就差別很大了。
第五欄代表儲存進結構是否按照順序儲存。
第六欄代表儲存進去結構的資料會不會自動排序。
好的,初步的介紹就到這邊了,一看到這張表格是不是有一種頭昏眼花的感覺?但是不用擔心,我們將會用深入淺出的方式來大家學習資料結構。