文章來源:網路作者:PaleSting/CSDN
在本文中,我們將考察Java中的資料類型,但我們將介紹抽象資料類型(ADT)的概念。我們也將透過介紹Java Collections Framework(Java 集合架構)來學習Java定義的一些ADT。
ADT
一個ADT是一個僅由保存的資料類型和可能在這個資料類型上進行的操作定義的。開發者們只能透過ADT的操作方法來存取ADT的屬性,而且他們不會知道這個資料型別內部各種操作是如何實現的。
在Java中,我們常常使用一個介面來給出一個操作集合而不需要透露這些操作實現的細節。記住一個介面定義了一個方法集而Java類別必須實作這個集合以便滿足它的強制性條件或實作這個介面的一個實例。
線性表,堆疊和佇列
當我們談論ADT的時候,常常會說到線性表,堆疊和佇列。我們不會討論這些資料結構的細節,但我們會討論為什麼它們被稱為ADT。
一個線性表是有限個元素的集合,其元素以線性的方式進行排列並提供對它的元素的直接存取。一個堆疊是一個後進先出(LIFO)的有序線性表,元素從堆疊頭加入,並從堆疊頭中取出。一個隊列是一個先進先出的有序線性表,元素從隊列尾加入,並從隊列頭取出。
線性表,堆疊和佇列的內部結構可以用許多方式實作。例如,我們可以使用一個有序數組或一個鍊錶來實現每個結構。關鍵的一點是不論你如何實現其內部結構,它對外的介面總是不變的。這使得你能夠修改或升級底層的實作過程而不需要改變公共介面部分。
Java 集合架構
Java 2軟體開發包(SDK)提供了一些新類別來支援大多數常用的ADT。這些類別稱為Java集合類別(類似MFC中的集合類別),它們協同工作從而形成Java 集合架構。這個集合架構提供了一套將資料表示成所謂的集合抽象資料的介面和類別。
java.util.Collection介面被用來表示任意的成組的對象,也就是元素。這個介面提供基本的諸如添加,刪除,和查詢這樣的操作。 Collection接口也提供了一個iterator方法。 iterator方法傳回java.util.Iterator介面的一個實例。而Iterator介面又提供了hasNext, next, 和remove方法。使用Iterator介面提供的方法,你可以從頭到尾循環遍歷一個Collection物件中的實例並且能夠安全的刪除iterator(遊標)所表示的元素。
java.util.AbstractCollection 是所有集合架構類別的基礎。 AbstractCollection 類別提供了對java.util.Collection 介面中除iterator和size方法以外的所有方法的實作。這兩個例外的方法由所有繼承java.util.AbstractCollection的子類別實作。
實作一個介面的類別必須提供對所有介面方法的實作。因為集合架構中的一些介面方法是可選的,所以必須有一種方法來通知呼叫者某種方法沒有實作。當一個可選的方法被實作而這個方法又沒有被實作的時候,就會拋出一個UnsupportedOperationException 例外。 UnsupportedOperationException 類別繼承了RuntimeException 類別。這使得呼叫者能夠呼叫所有的集合操作而不需要把每次呼叫都放在一個try-catch對裡。
List線性表
List介面繼承了Collection介面並定義了一個允許相同元素存在的有序集合。 List介面也附加了一些使用一個數值型索引值並基於元素在線性表中的位置來操作Collection中元素的方法。這些操作包括add,get,set和remove。
List介面也提供了listIterator方法。這個方法傳回java.util.ListIterator 介面的一個實例,這個實例能夠讓你從頭到尾或從尾至頭的遍歷一個線性表。 java.util.ListIterator 繼承了java.util.Iterator 介面。因此,它支援對它所代表的Collection中的元素的添加和修改。
下面的範例示範如何從後向前遍歷一個清單的元素。要完成這個工作,必須在遍歷開始之前把ListIterator定位在清單最後一個元素之後。
ListIterator iter = aList.listIterator(aList.size());
while (iter.hasPrevious())
System.out.println(iter.previous().toString());
}
集合架構提供了對List介面的兩個實作:LinkedList(鍊錶)和ArrayList(陣列列表,即靜態列表)。這兩個實作都支援對其元素的隨機存取。一個ArrayList實例支援數組風格的操作並支援數組大小的改變操作。一個LinkedList的實例則提供了在清單開始和結尾添加,刪除和提供元素的明確的支援。使用這些新方法,一個程式設計師可以簡單的把一個LinedList當作堆疊或佇列使用,如下:
LinkedList aQueue = new LinkedList(aCollection);
aQueue.addFirst(newElement);
Object anElement = aQueue.removeLast();
LinkedList aStack = new LinkedList(aCollection);
aStack.addFirst(newElement);
Object anElement= aStack.removeFirst();
表A中的程式碼片段使用java.util.ArrayList 和java.util.LinkedList示範了對java.util.List介面的實作實例的一些常用的操作。這些操作包括添加元素,隨機存取元素和明確的在清單尾刪除元素。
知其然不知其所以然是大有好處的
ADT提供了一個將物件公共介面中的操作和其具體的實現分開的強有力的工具。這使得一個ADT的實作可以不斷變化和演化同時保持其公共介面不變。 Java集合架構提供了大量的介面和其實作用來代表基本元素的集合並且可以用來創建有用的ADT。