21天學通java第19章集合框架_第1頁
21天學通java第19章集合框架_第2頁
21天學通java第19章集合框架_第3頁
21天學通java第19章集合框架_第4頁
21天學通java第19章集合框架_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第19章 集合框架在日常生活中,放衣服就是一門學問,是把襯衫和褲子等衣服都放在一個盒子中呢,還是每一件衣服放在一個盒子中呢,讀者都知道這兩種做法都是不好的,通常都是將一類衣服放在一起。同樣,在Java中也提供了這樣的功能,那就是集合框架。在前面已經(jīng)學習了數(shù)組,集合框架也是和數(shù)組一樣來保存一組數(shù)據(jù)。集合框架主要包括列表、集合和映射。通過本章的學習,讀者應該完成如下幾個目標。了解什么是集合框架和集合框架包括哪些形式。掌握什么是列表和列表中包括哪些類和接口。掌握什么是集合和集合中包括哪些類和接口。掌握什么是映射和映射中包括哪些類和接口。19.1 集合框架總論集合是某一類對象的通稱呼,這類對象代表以某

2、種方式組合到一起的一組對象;它是將多個元素組合為一個單元的對象,用于存儲,檢索,操縱和傳遞數(shù)據(jù)。而對象的集合時,指的是對象引用的集合而不是對象的集合,在Java集合中只存儲引用,對象在集合之外。集合框架提供用于管理對象集合的接口和類,它包括接口,實現(xiàn)和算法。19.1.1 什么是集合框架集合框架是Java提供的一些可以定義一個對象,該對象由其他的對象組成(如常見的向量(Vector)類)。集合框架是一個統(tǒng)一的可以代表及操作集合,并能對這些集合獨立的進行操作的一些結構。集合框架的主要優(yōu)點在于提高了編碼效率、性能和復用性。Java集合框架提供了有效的數(shù)據(jù)結構及算法,因此程序員不需要自己去編寫實現(xiàn)這些

3、功能。Java集合框架提供了高性能的數(shù)據(jù)結構及算法的實現(xiàn)。因為對各個接口的實現(xiàn)是可以互換的,因此程序很容易可以換接口。提高了Z軟件的復用性:軟件可以提供標準的集合框架的接口對其進行操作。Java集合框架主要由一組用來操作對象的接口組成。不同接口描述一組不同數(shù)據(jù)類型。在這些接口中Collection接口是層次結構中的根接口。在Collection接口中具有開發(fā)中經(jīng)常用使用到的set接口、list接口和map接口。19.1.2 Collection接口在上一小節(jié)中已經(jīng)知道,Collection接口是集合繼承樹中最頂層的接口,該接口聲明了集合中常用到的一些通用方法,在表中給出了這些方法。19.2 列

4、表List列表作為集合中的一種,其主要特點在于其中的元素保持一定的順序,并且元素是可以重復的。在本小節(jié)將具體講解List的使用及其實現(xiàn)類(如ArrayList、LinkedList)的使用。List接口繼承自Collection接口,代表列表的功能(角色),其中的元素可以按索引的順序訪問,所以也可以稱之為有索引的Collection。實現(xiàn)該接口的類均屬于Ordered類型,具有列表的功能,其元素順序均是按添加(索引)的先后進行排列的。19.2.1 List列表接口除了繼承了Collection聲明的方法外,List接口在iterator、add、remove、equals和hashCode方法

5、的基礎上加了一些其他約定,超過了Collection接口中指定的約定。同時,List比Collection多了10個方法,這些方法可以分為訪問方法、迭代器方法、搜索方法和插入、刪除方法。List接口聲明了3種對列表元素進行定位(索引)訪問方法:Object get(int index):參數(shù)index表示將要需要得到元素的索引。該方法將返回此列表中指定index位置上的元素。List subList(int fromIndex, int toIndex):參數(shù)fromIndex為指定的起始索引,參數(shù)toIndex為指定的結束索引,該方法將返回一個新的列表,這個新的列表將包含原來列表中從指定的起

6、始索引到指定的結束索引并且不包含結束索引的元素。Object toArray():該方法將類表轉換成一個Object類型的對象數(shù)組,該數(shù)組用元素的順序與列表中元素的順序相同,并將該數(shù)組返回。List接口聲明了特殊的迭代器,稱為ListIterator,除了允許Iterator接口提供的正常操作外,該迭代器還允許元素插入和替換,以及雙向訪問。還提供了一個方法來獲取從列表中指定位置開始的列表迭代器。List接口提供了對ListIterator的獲取的兩種方法,分別是listIterator方法和listIterator(int index)方法。 List接口聲明了兩種搜索指定對象的方法。從性能的

7、觀點來看,應該小心使用這些方法。在很多實現(xiàn)中,這些方法將執(zhí)行高開銷的線性搜索。List接口對其聲明如下:int indexOf(Object o):參數(shù)o為指定查找的元素,該方法將遍歷整個列表查找指定元素o,若列表中存在,則返回第一個找到的元素的索引,若列表中不存在,則返回負數(shù)。int lastIndexOf(Object o):參數(shù)o為指定查找的元素,該方法將遍歷整個列表查找指定元素o,若列表中存在,則返回最后一個找到的元素的索引,若列表中不存在,則返回負數(shù)。List接口聲明了兩種在列表的任意位置高效插入和刪除元素的方法。Object set(int index,Object element

8、):參數(shù)index表示需要替換元素的索引。參數(shù)o表示將要替換為的元素。該方法操作成功后將返回替換掉的元素。Object remove(int index):參數(shù)index為將要移除元素的索引。返回從列表中移除的元素。該方法操作后所有后續(xù)元素均向前移動,即列表中間不能有空位。boolean remove(Object o)方法:參數(shù)o為指定的需要移除的元素。若列表包含一個或多個與指定o相同的元素,則移除該元素,并返回 true,否則返回false。boolean removeAll(Collection c)方法:參數(shù)c為包含指定需要移除元素的Collection,該方法將列表中有的并且c中有的

9、元素從set中移除,若有元素被移除set則返回true,否則返回false。boolean retainAll(Collection c)方法:參數(shù)c為包含指定需要保留元素的Collection,該方法將列表中有的并且c中沒有的元素從set中移除,若有元素被移除set則返回true,否則返回false。java.util.List的幾種實現(xiàn)中,有三種最為常用的實現(xiàn)類,這三個類分別是Vector類、ArrayList類和LinkedList類。接下來將逐個介紹。19.2.2 Vector類Vector類也稱為向量,從Java一誕生就有,后來被作為集合框架的一部分,其性能特點與ArrayList基

10、本上是相同的。不同之處是該類的功能方法是同步的,同一時刻只能有一個線程訪問,沒有特殊需要,現(xiàn)在一般都使用ArrayList,ArrayList會在下一小節(jié)中講解。Vector提供了用于增加元素的方法,方法如下所述。public void addElement(Object obj)方法:該方法是將指定的組件添加到該向量的末尾,并將其大小增加1。如果向量的大小比容量大,則增大其容量。public void addElement(int index,Object obj)方法:該方法在該向量的指定位置index插入指定的元素obj。并將當前位于該位置的元素及所有后續(xù)元素右移(即將元素索引加1)。如

11、果索引超出范圍(即indexsize()),則程序拋出ArrayIndexOutOfBoundsException異常。public void insertElementAt(Object obj,int index)方法:該方法將指定對象作為此向量中的組件插入到指定的index處。19.2.3 ArrayList類本小節(jié)主要向讀者介紹ArrayList類,其是List接口最常用的實現(xiàn)之一,可以向其中添加包括null值在內(nèi)的所有對象引用型的元素,甚至該類對象引用自己也可以作為其中的元素,這樣便可以方便的搭建一個樹狀結構的集合。ArrayList有三種構造方法,方法如下所示:public Arr

12、ayList()方法:該構造器將構造一個空的ArrayList對象。該對象的初始容量為10。public ArrayList(int initialCapacity)方法:參數(shù)initialCapacity表示指定的初始容量,該構造器將構造一個具有指定容量的空ArrayList對象。public ArrayList(Collection c)方法:參數(shù)c為包含指定元素的Collection。該構造器將構造一個以c中的元素為初始內(nèi)容的ArrayList對象。ArrayList類和Vector類一樣,同樣也具有很多的方法,這里不可能為每一種方法都給出程序。 public boolean add(O

13、bject o)該方法將指定的元素o追加到此列表的末尾public void add(int index,Object o)該方法將指定的元素o插入此列表中的指定index索引位置public boolean addAll(Collection c)該方法將對象c中的所有元素追加到此列表的末尾public boolean addAll(int index,Collection c)該方法將參數(shù)c中的所有元素從指定的index索引位置開始插入到此列表中public void clear()該方法刪除列表對象中的所有元素public Object clone()該方法返回此ArrayList對象的

14、復制對象,返回為Object對象public boolean contains(Object elem)該方法用于判斷此列表中是否包含指定的元素elem,如果包含則返回truepublic void ensureCapacity (int minCapacity)該方法用于增加此ArrayList對象的容量,以確保它至少能夠容納最小容量參數(shù)所指定的元素數(shù)public E get(int index)該方法返回此列表對象中指定索引index位置上的元素public int indexOf(Object elem)該方法將返回給定參數(shù)elem元素第一次出現(xiàn)的位置public boolean isE

15、mpty()該方法將判斷此列表中是否沒有元素public int lastIndexOf(Object elem)該方法返回指定的對象elem元素在列表中最后一次出現(xiàn)的位置索引public Object remove(int index)該方法刪除此列表中指定位置index上的元素public boolean remove(Object o)該方法從此該列表中刪除指定元素oprotected void removeRange(int fromIndex,int toIndex)該方法刪除列表中索引在fromIndex和toIndex之間的所有元素。包括fromIndex,不包括toIndexp

16、ublic Object set(int index,Object o)該方法用指定的元素替代此列表中指定位置上的元素public int size()該方法返回此列表中的元素數(shù)public Object toArray()該方法返回一個此列表中所有元素的數(shù)組public T toArray(T a)該方法返回一個此列表中所有元素的數(shù)組,返回的數(shù)組存在在參數(shù)a中public void trimToSize()該方法將此ArrayList實例的容量調(diào)整為列表的當前大小ArrayList類中提供了可以刪除其中元素的方法,其方法聲明及使用說明如下所示。public E remove(int inde

17、x)方法:該方法刪除列表中參數(shù)指定位置index上的元素。向左移動所有后續(xù)元素,即將其索引減1。其中參數(shù)index為要刪除元素的索引。public boolean remove(Object o)方法:該方法刪除列表指定元素o。如果列表中包含指定的元素,則返回true,否則為false。public void clear()方法:該方法刪除列表中所有的元素。調(diào)用這個方法后,列表為空。19.2.4 LinkedList類本小節(jié)主要介紹LinkedList類,其功能與ArrayList、Vector相同,都是列表(List)的實現(xiàn)。其內(nèi)部是依賴雙鏈表來實現(xiàn)的,因此具有很好的插入刪除性能,但隨機訪問

18、元素的性能相對較差,適合用在插入、刪除多,元素隨機訪問少的場合。表列出了LinkedList類的幾個構造器。LinkedList類中同樣具有很多方法。在前面學習Vector類和ArrayList類時,已經(jīng)使用添加和刪除方法進行了舉例,這里就類使用LinkedList類中提供了獲取或修改某個位置的元素方法來舉例。獲取和刪除方法包括如下幾個方法。public E element()方法:該方法找到但不刪除此列表的頭(即第一個元素),這個方法是實現(xiàn)了接口Queue中的同名方法。public E get(int index)方法:該方法返回此列表中指定位置index處的元素。如果指定的索引超出范圍(i

19、ndex=size()),則程序拋出IndexOutOfBounds Exception異常。public E getFirst()方法:該方法返回此列表的第一個元素。如果此列表為空,則程序拋出NoSuchElementException異常。public E getLast():該方法返回此列表的最后一個元素。如果此列表為空,則程序拋出NoSuchElementException異常。public int indexOf(Object o)方法:該方法返回此列表中元素o的索引,需要注意的是,如果包含多個o,則返回為第一次出現(xiàn)的索引值。如果列表中不包含此元素,則返回-1。這個方法是覆蓋其父類A

20、bstractList中的indexOf方法。其中參數(shù)o為要搜索的元素。public int lastIndexOf(Object o)方法:該方法返回此列表中最后出現(xiàn)的指定元素的索引,如果列表中不包含此元素,則返回-1。參數(shù)o為要搜索的元素。public E peek()方法:該方法找到但不刪除此列表的頭,即第一個元素。如果此隊列為空,則返回null。public E poll()方法:該方法找到并刪除此列表的頭,即第一個元素。如果此隊列為空,則返回null。public E set(int index,E element)方法:該方法將此列表中指定位置的元素替換為指定的元素。其中參數(shù)ind

21、ex為要替換的元素的索引,element為要在指定位置存儲的元素。 19.3 集合Set集合是一種不包含重復元素的Collection,即任意的兩個元素e1和e2比較,結果都不相等。注意:Set的構造函數(shù)有一個約束條件,傳入的Collection參數(shù)不能包含重復的元素。必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態(tài),Object.equals(Object)=true會發(fā)生一些問題。19.3.1 Set接口Set接口與List接口最大的區(qū)別在于:Set中沒有重復的元素。Set是非常簡單的集合,Set中的對象沒有特定順序。Sorted接口具有排序的

22、功能,TreeSet類則是實現(xiàn)了該接口;HashSet類使用哈希算法存取集合中的元素,存取速度比較快。Set接口聲明如下所示:public interface Setextends Collection提示:Set接口與List接口最大的區(qū)別在于:Set中沒有重復的元素。19.3.2 SortedSet接口SortedSet繼承自Set接口,所以該接口不但具有Set的所有功能,而且是一個Sorted類型的Set。也就是說,實現(xiàn)該接口的類將按元素的天然順序自動排序,不管插入的順序是什么,其總會按照元素的天然順序進行遍歷。表列出了該接口中的常用方法。19.3.3 TreeSet類TreeSet類是

23、實現(xiàn)了接口SortedSet的類,已知SortedSet提供了集合元素的順序存儲,其中元素保持升序排列。此類保證排序后的set按照升序排列元素,根據(jù)使用的構造方法不同,可能會按照元素的自然順序進行排序。TreeSet類提供了四種構造方法,這些方法聲明及使用描述如下所示:TreeSet()方法:該構造器將構造一個空的TreeSet對象。TreeSet(Collection c)方法:參數(shù)c為包含指定元素的Collection。該構造器將構造一個以c中的元素為初始內(nèi)容的TreeSet對象。TreeSet(Comparator c)方法:參數(shù)c為指定的比較器,該構造器將構造具有指定比較器的空Tree

24、Set對象。TreeSet(SortedSet s)方法:參數(shù)s為包含指定元素的SortedSet。該構造器將構造一個以s中的元素為初始內(nèi)容的TreeSet對象。19.3.4 HashSet類HashSet類是Set接口最常用的實現(xiàn)之一,其既不是Ordered的也不是Sorted的,元素在其中存儲不保證任何順序。實際上,HashSet存儲對象引用時是按照哈希策略來實現(xiàn)的。另外,可以向HashSet中添加null值,但只能添加一次。表列出了HashSet類的幾個構造器。19.4 映射Map(映射)是一個存儲關鍵字和值的關聯(lián)或者說是關鍵字/值對的集合。給定一個關鍵字,可以得到其相應的值。關鍵字和值

25、都是對象。關鍵字必須是惟一的。但值是可以被復制的。而一個值對象可以是另一個Map,依次類推,這樣就可形成一個多級映射。對于鍵對象來說,像Set一樣,一個Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性。19.4.1 Map接口Map也可以稱之為鍵/值集合,因為在實現(xiàn)了該接口的集合中,元素都是成對出現(xiàn)的,一個稱之為鍵,另一個稱之為值。鍵和值都是對象,鍵對象用來在Map中惟一的標識一個值對象。鍵對象在Map中不能重復出現(xiàn),就像Set中的元素不能重復一樣。注意:與Collection系列的集合一樣,系統(tǒng)并不真正把對象放到Map中,Map中存放的只是鍵和值對象的引用。19.4.2 Hash

26、Map類HashMap類是基于哈希表的Map接口的實現(xiàn)。該類提供所有可選的映射操作,并允許使用null值和null鍵。但是此類不保證映射的順序。HashMap的實例有兩個參數(shù)影響其性能:初始容量和加載因子。容量是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時的容量。加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數(shù)超出了加載因子與當前容量的乘積時,通過調(diào)用rehash方法將容量翻倍。HashMap類聲明如下所示:public class HashMapextends AbstractMapimplements Map, Cloneable, SerializableH

27、ashMap類可為基本操作(get和put)提供穩(wěn)定的性能。迭代該集合視圖所需的時間與HashMap實例的“容量”(桶的數(shù)量)及其大小(鍵-值映射關系數(shù))之和成比例。所以,如果迭代性能很重要,則不要將初始容量設置得太高,或?qū)⒓虞d因子設置得太低。19.4.3 TreeMap類TreeMap類是SortedMap接口的基于紅黑樹的實現(xiàn)(紅黑樹是一種特定類型的二叉樹,是一種自平衡二叉查找樹,讀者可以查閱相關資料)。此類保證了映射按照升序順序排列關鍵字,根據(jù)使用的構造方法不同,可能會按照鍵的類的自然順序進行排序(參見Comparable),或者按照創(chuàng)建時所提供的比較器進行排序。TreeMap類的聲明如下所示:public class TreeMapextends AbstractMapimplements SortedMap, Cloneable, Serializable19.6 綜合練習1.如何使用集合中的sort方法對集合中的元素進行排序?【提示】01import java.util.*;02public class LianXi10304 public static void main(String args)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論