對java.util的總結 一

來源:互聯網
上載者:User


對java.util的總結 一
qzg589 原創  (參與分:123781,專家分:6302)   發表:2005-08-08 18:21   版本:1.0   閱讀:3141

java.util包中包含了一些在Java 2中新增加的最令人興奮的增強功能:類集。一個類集
(collection)是一組對象。類集的增加使得許多java.util中的成員在結構和體繫結構上發生
根本的改變。它也擴充了包可以被應用的任務範圍。類集是被所有Java程式員緊密關注的
最新型的技術。
除了類集,java.util還包含了支援範圍廣泛的函數的各種各樣的類和介面。這些類和接
口被核心的Java包廣泛使用,同時當然也可以被你編寫的程式所使用。對它們的應用程式套件括
產生偽隨機數,對日期和時間的操作,觀測事件,對位集的操作以及標記字串。由於
java.util具有許多特性,因此它是Java中最被廣泛使用的一個包。
java.util中包含的類如下。在Java 2中新增加的一些也被列出:
AbstractCollection (Java 2) EventObject Random
AbstractList (Java 2) GregorianCalendar ResourceBundle
AbstractMap (Java 2) HashMap (Java 2) SimpleTimeZone
AbstractSequentialList (Java 2) HashSet (Java 2) Stack
AbstractSet (Java 2) Hashtable StringTokenizer
ArrayList (Java 2) LinkedList (Java 2) Timer (Java 2, v1.3)
Arrays (Java 2) ListResourceBundle TimerTask (Java 2, v1.3)
BitSet Locale TimeZone
Calendar Observable TreeMap (Java 2)
Collections (Java 2) Properties TreeSet (Java 2)
Date PropertyPermission (Java 2) Vector
Dictionary PropertyResourceBundle WeakHashMap (Java 2)
java.util定義了如下的介面。注意其中大多數是在Java 2中新增加的。
Collection (Java 2) List (Java 2) Observer
Comparator (Java 2) ListIterator (Java 2) Set (Java 2)
Enumeration Map (Java 2) SortedMap (Java 2)
EventListener Map.Entry (Java 2) SortedSet (Java 2)
Iterator (Java 2)
ResourceBundle類,ListResourceBundle類和PropertyResourceBundle類協助具有特定地
區資源的大型程式國際化。關於這些類的討論,在這裡從略。授權對系統屬性進行讀/寫的
PropertyPermission類也超過了本書的討論範圍。EventObject和EventListener類將在第20章討
論。下面將對剩下的類和介面做詳細的討論。

15.1 類集概述
Java的類集(Collection)架構使你的程式處理對象組的方法標準化。在Java 2出現之前,
Java提供了一些專門的類如Dictionary,Vector,Stack和Properties去儲存和操作對象組。盡
管這些類非常有用,它們卻缺少一個集中,統一的主題。因此例如說使用Vector的方法就
會與使用Properties的方法不同。以前的專門的方法也沒有被設計成易於擴充和能適應新的
環境的形式。而類集解決了這些(以及其他的一些)問題。
類集架構被設計用於適應幾個目的。首先,這種架構是高效能的。對基本類集(動態
數組,連結資料表,樹和散列表)的實現是高效率的。一般很少需要人工去對這些“資料引擎”
編寫代碼(如果有的話)。第二點,架構必須允許不同類型的類集以相同的方式和高度互
操作方式工作。第三點,類集必須是容易擴充和/或修改的。為了實現這一目標,類集架構
被設計成包含一組標準的介面。對這些介面,提供了幾個標準的實現工具(例如LinkedList,
HashSet和TreeSet),通常就是這樣使用的。如果你願意的話,也可以實現你自己的類集。
為了方便起見,建立用於各種特殊目的的實現工具。一部分工具可以使你自己的類集實現
更加容易。最後,增加了允許將標準數組融合到類集架構中的機制。
演算法(Algorithms)是類集機制的另一個重要部分。演算法操作類集,它在Collections類
中被定義為靜態方法。因此它們可以被所有的類集所利用。每一個類集類不必實現它自己
的方案,演算法提供了一個處理類集的標準方法。
由類集架構建立的另一項是Iterator介面。一個迭代程式(iterator)提供了一個多用途
的,標準化的方法,用於每次訪問類集的一個元素。因此迭代程式提供了一種枚舉類集內
容(enumerating the contents of a collection)的方法。因為每一個類集都實現Iterator,所以
通過由Iterator定義的方法,任一類集類的元素都能被訪問到。因此,稍作修改,迴圈通過
集合的程式碼也可以被用來迴圈通過列表。
除了類集之外,架構定義了幾個映射介面和類。映射(Maps)儲存鍵/值對。儘管映射
在對項的正確使用上不是“類集”,但它們完全用類集整合。在類集架構的語言中,可以
獲得映射的類集“視圖”(collection-view)。這個“視圖”包含了從儲存在類集中的映射
得到的元素。因此,如果選擇了一個映射,就可以將其當做一個類集來處理。
對於由java.util定義的原始類,類集機制被更新以便它們也能夠整合到新的系統裡。所
以理解下面的說法是很重要的:儘管類集的增加改變了許多原始工具類的結構,但它卻不
會導致被拋棄。類集僅僅是提供了處理事情的一個更好的方法。
最後的一點:如果你對C++比較熟悉的話,那麼你可以發現Java的類集技術與在C++中
定義的標準模板庫(STL)相似。在C++中叫做容器(container),而在Java中叫做類集。

15.2 類集介面
類集架構定義了幾個介面。本節對每一個介面都進行了概述。首先討論類集介面是因
為它們決定了collection類的基本特性。不同的是,具體類僅僅是提供了標準介面的不同實
現。支援類集的介面總結在如下的表中:
介面描述
Collection 能使你操作對象組,它位於類集階層的頂層
List 擴充Collection去處理序列(對象的列表)
Set 擴充Collection去處理集合,集合必須包含唯一元素
SortedSet 擴充Set去處理排序集合
除了類集介面之外,類集也使用Comparator,Iterator和ListIterator介面。關於這些介面
將在本章後面做更深入的描述。簡單地說,Comparator介面定義了兩個對象如何比較;
Iterator和ListIterator介面枚舉類集中的對象。
為了在它們的使用中提供最大的靈活性,類集介面允許對一些方法進行選擇。可選擇
的方法使得使用者可以更改類集的內容。支援這些方法的類集被稱為可修改的
(modifiable)。不允許修改其內容的類集被稱為不可修改的(unmodifiable)。如果對一
個不可修改的類集使用這些方法,將引發一個UnsupportedOperationException異常。所有內
置的類集都是可修改的。
下面討論類集介面。
15.2.1 類集介面
Collection介面是構造類集架構的基礎。它聲明所有類集都將擁有的核心方法。這些方
法被總結在表15-1中。因為所有類集實現Collection,所以熟悉它的方法對於清楚地理解框
架是必要的。其中幾種方法可能會引發一個UnsupportedOperationException異常。正如上面
解釋的那樣,這些發生在當類集不能被修改時。當一個對象與另一個對象不相容,例如當
企圖增加一個不相容的對象到一個類集中時。將產生一個ClassCastException異常。
表15-1 由Collection 定義的方法
方法描述
boolean add(Object obj) 將obj加入到調用類集中。如果obj被加入到類集中了,則返
回true;如果obj已經是類集中的一個成員或類集不能被複製
時,則返回false
boolean addAll(Collection c) 將c中的所有元素都加入到調用類集中,如果操作成功(也
就是說元素被加入了),則返回true;否則返回false
void clear( ) 從調用類集中刪除所有元素
boolean contains(Object obj) 如果obj是調用類集的一個元素,則返回true,否則,返回false

boolean containsAll(Collection c) 如果調用類集包含了c中的所有元素,則返回true;否則,返
回false
boolean equals(Object obj) 如果調用類集與obj相等,則返回true;否則返回false
int hashCode( ) 返回調用類集的散列碼
boolean isEmpty( ) 如果調用類集是空的,則返回true;否則返回false
Iterator iterator( ) 返回調用類集的迭代程式
Boolean remove(Object obj) 從調用類集中刪除obj的一個執行個體。如果這個元素被刪除了,
則返回true;否則返回false
Boolean removeAll(Collection c) 從調用類集中刪除c的所有元素。如果類集被改變了(也就
是說元素被刪除了),則返回true;否則返回false
Boolean retainAll(Collection c) 刪除調用類集中除了包含在c中的元素之外的全部元素。如
果類集被改變了(也就是說元素被刪除了),則返回true,
否則返回false
int size( ) 返回調用類集中元素的個數
Object[ ] toArray( ) 返回一個數組,該數組包含了所有儲存在調用類集中的元
素。數組元素是類集元素的拷貝
Object[ ] toArray(Object array[ ]) 返回一個數組,該數組僅僅包含了那些類型與數組元素類型
匹配的類集元素。數組元素是類集元素的拷貝。如果array
的大小與匹配元素的個數相等,它們被返回到array。如果
array的大小比匹配元素的個數小,將分配並返回一個所需大
小的新數組,如果array的大小比匹配元素的個數大,在數組
中,在類集元素之後的單元被置為null。如果任一類集元素
的類型都不是array 的子類型, 則引發一個
ArrayStoreException異常
調用add( )方法可以將對象加入類集。注意add( )帶一個Object類型的參數。因為Object
是所有類的超類,所以任何類型的對象可以被儲存在一個類集中。然而原始類型可能不行。
例如,一個類集不能直接儲存類型int,char,double等的值。當然如果想儲存這些對象,也
可以使用在第14章中介紹的原始類型封裝器之一。可以通過調用addAll( )方法將一個類集的
全部內容增加到另一個類集中。
可以通過調用remove( )方法將一個對象刪除。為了刪除一組對象,可以調用removeAll( )
方法。調用retainAll( )方法可以將除了一組指定的元素之外的所有元素刪除。為了清空類集,
可以調用clear( )方法。
通過調用contains( )方法,可以確定一個類集是否包含了一個指定的對象。為了確定一
個類集是否包含了另一個類集的全部元素,可以調用containsAll( )方法。當一個類集是空的
時候,可以通過調用isEmpty( )方法來予以確認。調用size( )方法可以獲得類集中當前元素
的個數。

toArray( )方法返回一個數組,這個數組包含了儲存在調用類集中的元素。這個方法比
它初看上去的能力要更重要。經常使用類數組文法來處理類集的內容是有優勢的。通過在
類集和數組之間提供一條路徑,可以充分利用這兩者的優點。
調用equals( )方法可以比較兩個類集是否相等。“相等”的精確含義可以不同於從類集
到類集。例如,可以執行equals( )方法以便用於比較儲存在類集中的元素的值,換句話說,
equals( )方法能比較對元素的引用。
一個更加重要的方法是iterator( ),該方法對類集返回一個迭代程式。正如你將看到的
那樣,當使用一個類集架構時,迭代程式對於成功的編程來說是至關重要的。
15.2.2 List介面
List介面擴充了Collection並聲明儲存一系列元素的類集的特性。使用一個基於零的下
標,元素可以通過它們在列表中的位置被插入和訪問。一個列表可以包含複製元素。
除了由Collection定義的方法之外,List還定義了一些它自己的方法,這些方法總結在
表15-2中。再次注意當類集不能被修改時,其中的幾種方法引發UnsupportedOperation
Exception異常。當一個對象與另一個不相容,例如當企圖將一個不相容的對象加入一個類
集中時,將產生ClassCastException異常。
表15-2 由List 定義的方法
方法描述
void add(int index, Object obj) 將obj插入調用列表,插入位置的下標由index傳遞。任何已存
在的,在插入點以及插入點之後的元素將前移。因此,沒有元
素被覆蓋
boolean addAll(int index, Collection c) 將c中的所有元素插入到調用列表中,插入點的下標由index傳
遞。在插入點以及插入點之後的元素將前移。因此,沒有元素
被覆蓋。如果調用列表改變了,則返回true;否則返回false
Object get(int index) 返回儲存在調用類集內指定下標處的對象
int indexOf(Object obj) 返回調用列表中obj的第一個執行個體的下標。如果obj不是列表中
的元素,則返回-1
int lastIndexOf(Object obj) 返回調用列表中obj的最後一個執行個體的下標。如果obj不是列表
中的元素,則返回-1
ListIterator listIterator( ) 返回調用列表開始的迭代程式
ListIterator listIterator(int index) 返回調用列表在指定下標處開始的迭代程式
Object remove(int index) 刪除調用列表中index位置的元素並返回刪除的元素。刪除後,
列表被壓縮。也就是說,被刪除元素後面的元素的下標減一
Object set(int index, Object obj) 用obj對調用列表內由index指定的位置進行賦值
List subList(int start, int end) 返回一個列表,該列表包括了調用列表中從start到end?1的元
素。返回列表中的元素也被調用對象引用
對於由Collection定義的add( ) 和addAll( )方法,List增加了方法add(int, Object) 和

addAll(int, Collection)。這些方法在指定的下標處插入元素。由Collection定義的add(Object)
和addAll(Collection)的語義也被List改變了,以便它們在列表的尾部增加元素。
為了獲得在指定位置儲存的對象,可以用對象的下標調用get( )方法。為了給類表中的
一個元素賦值,可以調用set( )方法,指定被改變的對象的下標。調用indexOf( )或lastIndexOf( )
可以得到一個對象的下標。
通過調用subList( )方法,可以獲得列表的一個指定了開始下標和結束下標的子列表。
正如你能想象到的,subList( )方法使得列表處理十分方便。
15.2.3 集合介面
集合介面定義了一個集合。它擴充了Collection並說明了不允許複製元素的類集的特
性。因此,如果試圖將複製元素加到集合中時,add( )方法將返回false。它本身並沒有定義
任何附加的方法。
15.2.4 SortedSet介面
SortedSet介面擴充了Set並說明了按升序排列的集合的特性。除了那些由Set定義的方法
之外,由SortedSet介面說明的方法列在表15-3中。當沒有項包含在調用集合中時,其中的
幾種方法引發NoSuchElementException異常。當對象與調用集合中的元素不相容時,引發
ClassCastException 異常。如果試圖使用null 對象, 而集合不允許null 時, 引發
NullPointerException異常。
表15-3 由SortedSet 定義的方法
方法描述
Comparator comparator( ) 返回調用被排序集合的比較函數,如果對該集合使用自然順
序,則返回null
Object first( ) 返回調用被排序集合的第一個元素
SortedSet headSet(Object end) 返回一個包含那些小於end的元素的SortedSet,那些元素包
含在調用被排序集合中。返回被排序集合中的元素也被調用
被排序集合所引用
Object last( ) 返回調用被排序集合的最後一個元素
SortedSet subSet(Object start, Object end) 返回一個SortedSet,它包括了從start到end?1的元素。返回類
集中的元素也被調用對象所引用
SortedSet tailSet(Object start) 返回一個SortedSet,它包含了那些包含在分類集合中的大於
等於start的元素。返回集合中的元素也被調用對象所引用
SortedSet定義了幾種方法,使得對集合的處理更加方便。調用first( )方法,可以獲得集
合中的第一個對象。調用last( )方法,可以獲得集合中的最後一個元素。調用subSet( )方法,
可以獲得排序集合的一個指定了第一個和最後一個對象的子集合。如果需要得到從集合的
第一個元素開始的一個子集合,可以使用headSet( )方法。如果需要獲得集合尾部的一個子
集合,可以使用tailSet( )方法。

15.3 Collection類
現在,你已經熟悉了類集介面,下面開始討論實現它們的標準類。一些類提供了完整
的可以被使用的工具。另一些類是抽象的,提供主架構工具,作為建立具體類集的起始點。
沒有Collection類是同步的,但正如你將在本章後面看到的那樣,有可能獲得同步版本。
標準的Collection類總結在下面的表中。
類描述
AbstractCollection 實現大多數Collection介面
AbstractList 擴充AbstractCollection並實現大多數List介面
AbstractSequentialList 為了被類集使用而擴充AbstractList,該類集使用連續而不是隨機方
式訪問其元素
LinkedList 通過擴充AbstractSequentialList來實現連結資料表
ArrayList 通過擴充AbstractList來實現動態數組
AbstractSet 擴充AbstractCollection並實現大多數Set介面
HashSet 為了使用散列表而擴充AbstractSet
TreeSet 實現儲存在樹中的一個集合。擴充AbstractSet
注意:除了Collection類外,還有幾個從以前版本遺留下來的類,如Vector,Stack
和Hashtable均被重新設計成支援類集的形式。這些內容將在本章後面討論。
下面討論具體的Collection類,舉例說明它們的用法。
15.3.1 ArrayList類
ArrayList類擴充AbstractList並執行List介面。ArrayList支援可隨需要而增長的動態數
組。在Java中,標準數組是定長的。在數組建立之後,它們不能被加長或縮短,這也就意
味著你必須事Crowdsourced Security Testing道數組可以容納多少元素。但是,你直到運行時才能知道需要多大的數
組。為瞭解決這個問題,類集架構定義了ArrayList。本質上,ArrayList是對象引用的一個
變長數組。也就是說,ArrayList能夠動態地增加或減小其大小。數組列表以一個原始大小
被建立。當超過了它的大小,類集自動增大。當對象被刪除後,數組就可以縮小。
注意:動態數組也被從以前版本遺留下來的類Vector所支援。關於這一點,將在
本章後面介紹。
ArrayList有如下的建構函式:
ArrayList( )
ArrayList(Collection c)
ArrayList(int capacity)
其中第一個建構函式建立一個空的數組列表。第二個建構函式建立一個數組列表,該
306 第2 部分Java 庫
數組列表由類集c中的元素初始化。第三個建構函式建立一個數組列表,該數組有指定的初
始容量(capacity)。容量是用於儲存元素的基本數組的大小。當元素被追加到數組列表上
時,容量會自動增加。
下面的程式展示了ArrayList的一個簡單應用。首先建立一個數組列表,接著添加類型
String的對象(回想一個引用字串被轉化成一個字串(String)對象)。接著列表被顯
示出來。將其中的一些元素刪除後,再一次顯示列表。
// Demonstrate ArrayList.
import java.util.*;
class ArrayListDemo {
public static void main(String args[]) {
// create an array list
ArrayList al = new ArrayList();
System.out.println("Initial size of al: " +
al.size());
// add elements to the array list
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
al.add(1, "A2");
System.out.println("Size of al after additions: " +
al.size());
// display the array list
System.out.println("Contents of al: " + al);
// Remove elements from the array list
al.remove("F");
al.remove(2);
System.out.println("Size of al after deletions: " +
al.size());
System.out.println("Contents of al: " + al);
}
}
該程式的輸出如下所示:
Initial size of al: 0
Size of al after additions: 7
Contents of al: [C, A2, A, E, B, D, F]
Size of al after deletions: 5
Contents of al: [C, A2, E, B, D]
注意a1開始時是空的,當添加元素後,它的大小增加了。當有元素被刪除後,它的大  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.