版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 Java 集合排序及集合排序及 java 集合類詳解集合類詳解 (C Co ol ll le ec ct ti io on n, , L Li is st t, , S Se et t, , M Ma ap p) 摘摘要要內內容容 集合是 Java 里面最常用的,也是最重要的一部分。能夠用好集合和 理解好集合對于做Java 程序的開發(fā)擁有無比的好處。本文詳細解釋了關 于 Java 中的集合是如何實現(xiàn)的,以及他們的實現(xiàn)原理。 目目 錄錄 1 集集合合框框架架 .2 1.1 集集合合框框架架概概述述 .2 1.1.1 容容器器簡簡介介 .2 1.1.
2、2 容容器器的的分分類類 .5 1.2 Collection.6 1.2.1 常用方法 .6 1.2.2 迭迭代代器器 .9 1.3 List.11 1.3.1 概述 .11 1.3.2 常用方法 .12 1.3.3 實實現(xiàn)現(xiàn)原原理理 .17 1.4 Map .20 1.4.1 概述 .20 1.4.2 常用方法 .21 1.4.3 Comparable 接接口口 .27 1.4.4 實實現(xiàn)現(xiàn)原原理理 .29 1.4.5 覆覆寫寫 hashCode().34 1.5 Set .39 1.5.1 概述 .39 1.5.2 常用方法 .39 1.5.3 實實現(xiàn)現(xiàn)原原理理 .45 1.6 總結 :集
3、合框架中常用類比較 .46 2 練習 .47 3 附錄:排序 .48 1 集集合合框框架架 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 1.1 集集合合框框架架概概述述 1.1.1 容容器器簡簡介介 到目前為止,我們已經(jīng)學習了如何創(chuàng)建多個不同的對象,定義了這些 對象以后,我們就可以利用它們來做一些有意義的事情。 舉例來說,假設要存儲許多雇員,不同的雇員的區(qū)別僅在于雇員的 身份證號。我們可以通過身份證號來順序存儲每個雇員,但是在內存中實 現(xiàn)呢?是不是要準備足夠的內存來存儲1000 個雇員,然后再將這些雇 員逐一插入?如果已經(jīng)插入了500 條記錄,這時需要插入一個身份證號 較低的新雇員,該怎么
4、辦呢?是在內存中將500 條記錄全部下移后,再 從開頭插入新的記錄 ? 還是創(chuàng)建一個映射來記住每個對象的位置?當決 定如何存儲對象的集合時,必須考慮如下問題。 對于對象集合,必須執(zhí)行的操作主要以下三種: 添加新的對象 刪除對象 查找對象 我們必須確定如何將新的對象添加到集合中。可以將對象添加到集合的 末尾、開頭或者中間的某個邏輯位置。 從集合中刪除一個對象后,對象集合中現(xiàn)有對象會有什么影響呢?可能 必須將內存移來移去,或者就在現(xiàn)有對象所駐留的內存位置下一個“ 洞”。 在內存中建立對象集合后,必須確定如何定位特定對象??山⒁?種機制,利用該機制可根據(jù)某些搜索條件(例如身份證號)直接定位到目 標
5、對象;否則,便需要遍歷集合中的每個對象,直到找到要查找的對象為 止。 前面大家已經(jīng)學習過了數(shù)組。數(shù)組的作用是可以存取一組數(shù)據(jù)。但 是它卻存在一些缺點,使得無法使用它來比較方便快捷的完成上述應用場 景的要求。 1. 首先,在很多數(shù)情況下面,我們需要能夠存儲一組數(shù)據(jù)的容 器,這一點雖然數(shù)組可以實現(xiàn),但是如果我們需要存儲的數(shù)據(jù)的 個數(shù)多少并不確定。比如說:我們需要在容器里面存儲某個應用 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 系統(tǒng)的當前的所有的在線用戶信息,而當前的在線用戶信息是時 刻都可能在變化的。 也就是說,我們需要一種存儲數(shù)據(jù)的容 器,它能夠自動的改變這個容器的所能存放的數(shù)據(jù)數(shù)量的大小
6、。 這一點上,如果使用數(shù)組來存儲的話,就顯得十分的笨拙。 2. 我們再假設這樣一種場景:假定一個購物網(wǎng)站,經(jīng)過一段時 間的運行,我們已經(jīng)存儲了一系列的購物清單了,購物清單中有 商品信息。如果我們想要知道這段時間里面有多少種商品被銷售 出去了。那么我們就需要一個容器能夠自動的過濾掉購物清單中 的關于商品的重復信息。如果使用數(shù)組,這也是很難實現(xiàn)的。 3. 最后再想想,我們經(jīng)常會遇到這種情況,我知道某個人的帳 號名稱,希望能夠進一步了解這個人的其他的一些信息。也就是 說,我們在一個地方存放一些用戶信息,我們希望能夠通過用戶 的帳號來查找到對應的該用戶的其他的一些信息。再舉個查字典 例子:假設我們希望
7、使用一個容器來存放單詞以及對于這個單詞 的解釋,而當我們想要查找某個單詞的意思的時候,能夠根據(jù)提 供的單詞在這個容器中找到對應的單詞的解釋。如果使用數(shù)組來 實現(xiàn)的話,就更加的困難了。 為解決這些問題, Java 里面就設計了容器集合,不同的容器集合以不 同的格式保存對象。 數(shù)數(shù)學學背背景景 在常見用法中,集合( collection)和數(shù)學上直觀的集( set)的 概念是相同的。集是一個唯一項組,也就是說組中沒有重復項。實際上,“ 集合框架 ”包含了一個 Set 接口和許多具體的 Set 類。但正式的集 概念卻比 Java 技術提前了一個世紀,那時英國數(shù)學家 George Bo ole 按邏輯
8、正式的定義了集的概念。大部分人在小學時通過我們熟悉的維 恩圖引入的 “集的交 ”和“集的并 ”學到過一些集的理論。 集的基本屬性如下: 集內只包含每項的一個實例 集可以是有限的,也可以是無限的 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 可以定義抽象概念 集不僅是邏輯學、數(shù)學和計算機科學的基礎,對于商業(yè)和系統(tǒng)的日常 應用來說,它也很實用。 “連接池 ”這一概念就是數(shù)據(jù)庫服務器的一個開 放連接集。 Web 服務器必須管理客戶機和連接集。文件描述符提供了操 作系統(tǒng)中另一個集的示例。 映射是一種特別的集。它是一種對(pair)集,每個對表示一個元 素到另一元素的單向映射。一些映射示例有: IP
9、地址到域名( DNS)的映射 關鍵字到數(shù)據(jù)庫記錄的映射 字典(詞到含義的映射) 2 進制到 10 進制轉換的映射 就像集一樣,映射背后的思想比 Java 編程語言早的多,甚至比計 算機科學還早。而Java 中的 Map 就是映射的一種表現(xiàn)形式。 1.1.2 容容器器的的分分類類 既然您已經(jīng)具備了一些集的理論,您應該能夠更輕松的理解“集合 框架”。 “集合框架 ”由一組用來操作對象的接口組成。不同接口描述不同 類型的組。在很大程度上,一旦您理解了接口,您就理解了框架。雖然您 總要創(chuàng)建接口特定的實現(xiàn),但訪問實際集合的方法應該限制在接口方法的 使用上;因此,允許您更改基本的數(shù)據(jù)結構而不必改變其它代碼
10、??蚣芙?口層次結構如下圖所示。 Java 容器類類庫的用途是 “保存對象 ”,并將其劃分為兩個不同的 概念: 1) Collection 。 一組對立的元素,通常這些元素都服從某種規(guī)則。 List 必須保持元素特定的順序,而Set 不能有重復元素。 2) Map 。 一組 成對的 “鍵值對 ”對象。初看起來這似乎應該是 一個 Collection ,其元素是成對的對象,但是這樣的設計實現(xiàn)起來 太笨拙了,于是我們將Map 明確的提取出來形成一個獨立的概念 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 。Map 一樣容易擴展成多維Map ,無需增加新的概念,只要讓 Map 中的鍵值對的每個 “
11、值”也是一個 Map 即可。 Collection 和 Map 的區(qū)別在于容器中每個位置保存的元素個數(shù)。Co llection 每個位置只能保存一個元素(對象)。此類容器包括:List ,它以特定的順序保存一組元素;Set 則是元素不能重復。 Map 保存的是 “鍵值對 ”,就像一個小型數(shù)據(jù)庫。我們可以通過“ 鍵”找到該鍵對應的 “值”。 Collection 對象之間沒有指定的順序,允許重復元素。 Set 對象之間沒有指定的順序,不允許重復元素 List 對象之間有指定的順序,允許重復元素,并引入位置 下標。 Map 接口用于保存關鍵字( Key)和數(shù)值( Value)的 集合,集合中的每個
12、對象加入時都提供數(shù)值和關鍵字。Map 接口既不繼承 Set 也不繼承 Collection。 List、Set、Map 共同的實現(xiàn)基礎是Object 數(shù)組 除了四個歷史集合類外, Java 2 框架還引入了六個集合實現(xiàn),如 下表所示。 接口接口實現(xiàn)實現(xiàn)歷史集合類歷史集合類 Set HashSet TreeSet List ArrayList Vector LinkedList Stack Map HashMap Hashtable TreeMap Properties 歷史集合類部分解釋歷史集合類部分解釋 Vector 是個像可增大數(shù)組的歷史集合類,但它可以存儲不同類型的數(shù) 據(jù)元素。 Java
13、 2 SDK,版本 2 中 Vector 類被改良到 “集合框架 ”層次 結構中以實現(xiàn) List 接口。但是,如果您在使用新框架,您應該使用 Ar rayList,而不是 List。 從 Vector 轉換為 ArrayList 時,一個關鍵的差別是 為了更改元 素值的位置,參數(shù)的順序被顛倒了。 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 Stack 類繼承 Vector,通過 push() 和 pop() 方法以實現(xiàn)一個標準的 后進先出( last-in-first-out(LIFO)堆棧??墒牵覀円斝?。因為 Stack 類繼承 Vector 類,您仍然可以用被繼承的 Vector
14、的方法訪問或 修改 Stack。 Enumeration 接接口口 Enumeration 接口允許您迭代集合中的所有元素。在“集合框架 ”中 ,該接口被 Iterator 接口替代。但是,并不是所有的庫都支持較新的接口 ,所以您可能會發(fā)現(xiàn)自己常常使用 Enumeration。盡管有些人更喜歡 It erator 這個方法名稱,但用 Enumeration 迭代和用 Iterator 迭代類似。 不過, Enumeration 不支持除去操作。 Enumeration enum = .; while (enum.hasNextElement() Object element = iterato
15、r.nextElement(); / process element Hashtable 實現(xiàn)是個一般的字典,它允許存儲任何對象作為它的鍵或 值(包括 null)。在 Java 2 SDK,版本 1.2 中,這個類被重新改寫 到“集合框架 ”中去實現(xiàn) Map 接口。所以,您可用原始的 Hashtable 方法或較新的 Map 方法。如果您需要一個同步的 Map,使用 Hashta ble 比使用同步的 HashMap 稍快一些。 任何集合 ( Collection )都能產生一個迭代器 ( Iterator ),而一 個 List 除了能生成一個 ListIterator (列表迭代器)外 ,
16、還能生成一個 普通迭代器 ,因為 List 正是從集合繼承來的 . 1.2 Collection 1.2.1 常常用用方方法法 Collection 接口用于表示任何對象或元素組。想要盡可能以常規(guī)方式處理 一組元素時,就使用這一接口。Collection 在前面的大圖也可以看出,它是Lis t 和 Set 的父類。并且它本身也是一個接口。它定義了作為集合所應該擁有的一些 方法。如下: 注意 : 集合必須只有對象,集合中的元素不能是基本數(shù)據(jù)類型。 Collection 接口支持如添加和除去等基本操作。設法除去一個元素時,如果這 個元素存在,除去的僅僅是集合中此元素的一個實例。 boolean a
17、dd(Object element) 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 boolean remove(Object element) Collection 接口還支持查詢操作: int size() boolean isEmpty() boolean contains(Object element) Iterator iterator() 組操作 :Collection 接口支持的其它操作,要么是作用于元素組的任務,要 么是同時作用于整個集合的任務。 boolean containsAll(Collection collection) boolean addAll(Collect
18、ion collection) void clear() void removeAll(Collection collection) void retainAll(Collection collection) containsAll() 方法允許您查找當前集合是否包含了另一個集合的所有元素,即另一個集合 是否是當前集合的子集。其余方法是可選的,因為特定的集合可能不支持集合更改。 addAll() 方法確保另一個集合中的所有元素都被添加到當前的集合中,通常稱為并。 clear() 方法從當前集合中除去所有元素。 removeAll() 方法類似于 clear() ,但只除去了 元素的一個子集。
19、retainAll() 方法類似于 removeAll() 方法,不過可能感到它所做的與前 面正好相反:它從當前集合中除去不屬于另一個集合的元素,即交。 我們看一個簡單的例子,來了解一下集合類的基本方法的使用: import java.util.*; public class CollectionToArray public static void main(String args) Collection collection1=new ArrayList();/創(chuàng)建一個集合對象 collection1.add(000);/添加對象到 Collection 集合中 collection1.ad
20、d(111); collection1.add(222); System.out.println(集合 collection1 的大?。?collection1.size(); System.out.println(集合 collection1 的內容:+collection1); collection1.remove(000);/從集合 collection1 中移除掉 000 這個對象 System.out.println(集合 collection1 移除 000 后的內容:+collection1); System.out.println(集合 collection1 中是否包含 00
21、0 :+collection1.contains(000); System.out.println(集合 collection1 中是否包含 111 :+collection1.contains(111); Collection collection2=new ArrayList(); collection2.addAll(collection1);/將 collection1 集合中的元素全部都加到 collection2 中 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 System.out.println(集合 collection2 的內容:+collection2); collec
22、tion2.clear();/清空集合 collection1 中的元素 System.out.println(集合 collection2 是否為空 :+collection2.isEmpty(); /將集合 collection1 轉化為數(shù)組 Object s= collection1.toArray(); for(int i=0;is.length;i+) System.out.println(si); 運行結果為: 集合 collection1 的大?。? 集合 collection1 的內容:000, 111, 222 集合 collection1 移除 000 后的內容:111,
23、222 集合 collection1 中是否包含 000 :false 集合 collection1 中是否包含 111 :true 集合 collection2 的內容:111, 222 集合 collection2 是否為空 :true 111 222 這里需要注意的是, Collection 它僅僅只是一個接口,而我們真正使 用的時候,確是創(chuàng)建該接口的一個實現(xiàn)類。做為集合的接口,它定義了所 有屬于集合的類所都應該具有的一些方法。 而 ArrayList (列表)類是集合類的一種實現(xiàn)方式。 這里需要一提的是,因為Collection 的實現(xiàn)基礎是數(shù)組,所以有轉換 為 Object 數(shù)組的方
24、法: Object toArray() Object toArray(Object a) 其中第二個方法 Object toArray(Object a) 的參數(shù) a 應該是集 合中所有存放的對象的類的父類。 1.2.2 迭迭代代器器 任何容器類,都必須有某種方式可以將東西放進去,然后由某種方式 將東西取出來。畢竟,存放事物是容器最基本的工作。對于ArrayList ,add()是插入對象的方法,而get()是取出元素的方式之一。 ArrayL 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 ist 很靈活,可以隨時選取任意的元素,或使用不同的下標一次選取多個元 素。 如果從更高層的角度思考,
25、會發(fā)現(xiàn)這里有一個缺點:要使用容器,必 須知道其中元素的確切類型。初看起來這沒有什么不好的,但是考慮如下 情況:如果原本是ArrayList ,但是后來考慮到容器的特點,你想換用Se t ,應該怎么做?或者你打算寫通用的代碼,它們只是使用容器,不知道 或者說不關心容器的類型,那么如何才能不重寫代碼就可以應用于不同類 型的容器? 所以迭代器 (Iterator)的概念,也是出于一種設計模式就是為達成 此目的而形成的。所以Collection 不提供 get()方法。如果要遍歷Colle ctin 中的元素,就必須用Iterator。 迭代器( Iterator)本身就是一個對象,它的工作就是遍歷并
26、選擇 集合序列中的對象,而客戶端的程序員不必知道或關心該序列底層的結構 。此外,迭代器通常被稱為“輕量級 ”對象,創(chuàng)建它的代價小。但是, 它也有一些限制,例如,某些迭代器只能單向移動。 Collection 接口的 iterator() 方法返回一個 Iterator。Iterat or 和您可能已經(jīng)熟悉的 Enumeration 接口類似。使用 Iterator 接 口方法,您可以從頭至尾遍歷集合,并安全的從底層 Collection 中 除去元素。 下面,我們看一個對于迭代器的簡單使用: import java.util.ArrayList; import java.util.Collec
27、tion; import java.util.Iterator; public class IteratorDemo public static void main(String args) Collection collection = new ArrayList(); collection.add(s1); collection.add(s2); collection.add(s3); Iterator iterator = collection.iterator();/得到一個迭 代器 while (iterator.hasNext() /遍歷 Object element = iter
28、ator.next(); System.out.println(iterator = + element); 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 if(collection.isEmpty() System.out.println(collection is Empty!); else System.out.println(collection is not Empty! size =+collection.size(); Iterator iterator2 = collection.iterator(); while (iterator2.hasNext() /移除元素 Obj
29、ect element = iterator2.next(); System.out.println(remove: +element); iterator2.remove(); Iterator iterator3 = collection.iterator(); if (!iterator3.hasNext() /察看是否還有元素 System.out.println(還有元素 ); if(collection.isEmpty() System.out.println(collection is Empty!); /使用 collection.isEmpty()方法來判斷 程序的運行結果為
30、: iterator = s1 iterator = s2 iterator = s3 collection is not Empty! size=3 remove: s1 remove: s2 remove: s3 還有元素 collection is Empty! 可以看到, Java 的 Collection 的 Iterator 能夠用來,: 1) 使用方法 iterator() 要求容器返回一個Iterator .第一次調 用 Iterator 的 next() 方法時,它返回集合序列的第一個元素。 2) 使用 next() 獲得集合序列的中的下一個元素。 3) 使用 hasNext
31、()檢查序列中是否元素。 4) 使用 remove()將迭代器新返回的元素刪除。 需要注意的是:方法刪除由next 方法返回的最后一個元素,在每次 調用 next 時,remove 方法只能被調用一次 。 Comment i1: 它有兩個子接口: 1、List 2、Set 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 大家看, Java 實現(xiàn)的這個迭代器的使用就是如此的簡單。Iterator (跌代器) 雖然功能簡單,但仍然可以幫助我們解決許多問題,同時 針對 List 還有一個更復雜更高級的ListIterator。您可以在下面的List 講解中得到進一步的介紹。 1.3 List 1.3
32、.1 概概述述 前面我們講述的Collection 接口實際上并沒有直接的實現(xiàn)類。而 List 是 容器的一種,表示列表的意思。當我們不知道存儲的數(shù)據(jù)有多少的情況,我們就 可以使用 List 來完成存儲數(shù)據(jù)的工作。例如前面提到的一種場景。我們想要在 保存一個應用系統(tǒng)當前的在線用戶的信息。我們就可以使用一個List 來存 儲。因為 List 的最大的特點就是能夠自動的根據(jù)插入的數(shù)據(jù)量來動態(tài)改變容器 的大小。下面我們先看看List 接口的一些常用方法。 1.3.2 常常用用方方法法 List 就是列表的意思,它是Collection 的一種,即繼承了 Collection 接口,以定義一個允許重復
33、項的有序集合。該接口不但能夠對列表的一部分進行處 理,還添加了面向位置的操作。List 是按對象的進入順序進行保存對象,而不做 排序或編輯操作。 它除了擁有 Collection 接口的所有的方法外還擁有一些其他的 方法。 面向位置的操作包括插入某個元素或 Collection 的功能,還包括獲取、 除去或更改元素的功能。在 List 中搜索元素可以從列表的頭部或尾部開始,如 果找到元素,還將報告元素所在的位置。 void add(int index, Object element) :添加對象 element 到位置 inde x 上 boolean addAll(int index, Co
34、llection collection) :在 index 位置后添 加容器 collection 中所有的元素 Object get(int index) :取出下標為 index 的位置的元素 int indexOf(Object element) :查找對象 element 在 List 中第一次出 現(xiàn)的位置 int lastIndexOf(Object element) :查找對象 element 在 List 中最后出 現(xiàn)的位置 Object remove(int index) :刪除 index 位置上的元素 Object set(int index, Object element
35、) :將 index 位置上的對象替換為 element 并返回老的元素。 先看一下下面表格: 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 簡述簡述 實現(xiàn)實現(xiàn) 操作特性操作特性 成員要求成員要求 ArrayList 提供快速的基于索引的成員訪提供快速的基于索引的成員訪 問,對尾部成員的增加和刪除問,對尾部成員的增加和刪除 支持較好支持較好 成員可為任意成員可為任意 Object 子類的對象子類的對象 List 提供基于索引提供基于索引 的對成員的隨的對成員的隨 機訪問機訪問 LinkedList 對列表中任何位置的成員的增對列表中任何位置的成員的增 加和刪除支持較好,但對基于加和刪除支持較
36、好,但對基于 索引的成員訪問支持性能較差索引的成員訪問支持性能較差 成員可為任意成員可為任意 Object 子類的對象子類的對象 在“集合框架 ”中有兩種常規(guī)的 List 實現(xiàn):ArrayList 和 Linke dList。使用兩種 List 實現(xiàn)的哪一種取決于您特定的需要。如果要支持 隨機訪問,而不必在除尾部的任何位置插入或除去元素,那么,Array List 提供了可選的集合。但如果,您要頻繁的從列表的中間位置添加和 除去元素,而只要順序的訪問列表元素,那么,LinkedList 實現(xiàn)更好 。 我們以 ArrayList 為例,先看一個簡單的例子: 例子中,我們把 12 個月份存放到 A
37、rrayList 中,然后用一個循環(huán), 并使用 get()方法將列表中的對象都取出來。 而 LinkedList 添加了一些處理列表兩端元素的方法(下圖只顯示了新方法 ): 使用這些新方法,您就可以輕松的把 LinkedList 當作一個堆棧、隊列或 其它面向端點的數(shù)據(jù)結構。 我們再來看另外一個使用LinkedList 來實現(xiàn)一個簡單的隊列的例子 : import java.util.*; public class ListExample public static void main(String args) LinkedList queue = new LinkedList(); queu
38、e.addFirst(Bernadine); queue.addFirst(Elizabeth); queue.addFirst(Gene); queue.addFirst(Elizabeth); queue.addFirst(Clara); System.out.println(queue); queue.removeLast(); queue.removeLast(); 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 System.out.println(queue); 運行程序產生了以下輸出。請注意,與 Set 不同的是 List 允許重復。 Clara, Elizabeth, Gene
39、, Elizabeth, Bernadine Clara, Elizabeth, Gene 該的程序演示了具體 List 類的使用。第一部分,創(chuàng)建一個由 ArrayLi st 支持的 List。填充完列表以后,特定條目就得到了。示例的 LinkedLis t 部分把 LinkedList 當作一個隊列,從隊列頭部添加東西,從尾部除去。 List 接口不但以位置友好的方式遍歷整個列表,還能處理集合的子集: ListIterator listIterator() :返回一個 ListIterator 跌代器, 默認開始位置為 ListIterator listIterator(int startI
40、ndex) :返回一個 ListItera tor 跌代器,開始位置為startIndex List subList(int fromIndex, int toIndex) :返回一個子列表 List ,元素存放為從 fromIndex 到 toIndex 之前的一個元素。 處理 subList() 時,位于 fromIndex 的元素在子列表中,而位于 to Index 的元素則不是,提醒這一點很重要。以下 for-loop 測試案例大致反 映了這一點: for (int i=fromIndex; itoIndex; i+) / process element at position i 此
41、外,我們還應該提醒的是:對子列表的更改(如 add()、remove() 和 set() 調用)對底層 List 也有影響。 ListIterator 接接口口 ListIterator 接口繼承 Iterator 接口以支持添加或更改底層集合中的 元素,還支持雙向訪問 。 以下源代碼演示了列表中的反向循環(huán)。請注意 ListIterator 最初位于 列表尾之后( list.size()),因為第一個元素的下標是0。 List list = .; ListIterator iterator = list.listIterator(list.size(); 安徽工商職業(yè)學院 電子信息系軟件教研室
42、 胡貴恒 while (iterator.hasPrevious() Object element = iterator.previous(); / Process element 正常情況下,不用 ListIterator 改變某次遍歷集合元素的方向 向 前或者向后。雖然在技術上可能實現(xiàn)時,但在 previous() 后立刻調用 nex t(),返回的是同一個元素。把調用 next() 和 previous() 的順序顛倒一下 ,結果相同。 我們看一個 List 的例子: import java.util.*; public class ListIteratorTest public sta
43、tic void main(String args) List list = new ArrayList(); list.add(aaa); list.add(bbb); list.add(ccc); list.add(ddd); System.out.println(下標 0 開始: +list.listIterator(0). next();/next() System.out.println(下標 1 開始 :+list.listIterator(1).n ext(); System.out.println(子 List 1-3:+list.subList(1,3); /子列表 List
44、Iterator it = list.listIterator();/默認從下標 0 開 始 /隱式光標屬性add 操作 ,插入到當前的下標的前面 it.add(sss); while(it.hasNext() System.out.println(next Index=+it.nextIndex()+,O bject=+it.next(); /set 屬性 ListIterator it1 = list.listIterator(); it1.next(); it1.set(ooo); ListIterator it2 = list.listIterator(list.size();/ 下標
45、 while(it2.hasPrevious() System.out.println(previous Index=+it2.previous Index()+,Object=+it2.previous(); 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 程序的執(zhí)行結果為: 下標 0 開始: aaa 下標 1 開始 :bbb 子 List 1-3:bbb, ccc next Index=1,Object=aaa next Index=2,Object=bbb next Index=3,Object=ccc next Index=4,Object=ddd previous Index=4,O
46、bject=ddd previous Index=3,Object=ccc previous Index=2,Object=bbb previous Index=1,Object=aaa previous Index=0,Object=ooo 我們還需要稍微再解釋一下 add() 操作。添加一個元素會導致新元 素立刻被添加到隱式光標的前面。因此,添加元素后調用 previous() 會返回新元素,而調用 next() 則不起作用,返回添加操作之前的下一 個元素。下標的顯示方式,如下圖所示: 對于 List 的基本用法我們學會了,下面我們來進一步了解一下List 的實 現(xiàn)原理,以便價升我們對于集
47、合的理解。 1.3.3 實實現(xiàn)現(xiàn)原原理理 前面已經(jīng)提了一下Collection 的實現(xiàn)基礎都是基于數(shù)組的。下面我們 就已 ArrayList 為例, 簡單分析一下 ArrayList 列表的實現(xiàn)方式。首先 ,先看下它的構造函數(shù)。 下列表格是在 SUN 提供的 API 中的描述: ArrayList() Constructs an empty list with an initial capacity of ten. ArrayList(Collection c) Constructs a list containing the elements of the specified collect
48、ion, in the order they are returned by the collections iterator. ArrayList(int initialCapacity) Constructs an empty list with the specified initial capacity. 安徽工商職業(yè)學院 電子信息系軟件教研室 胡貴恒 其中第一個構造函數(shù)ArrayList()和第二構造函數(shù)ArrayList(Collecti on c) 是按照Collection 接口文檔所述,所應該提供兩個構造函數(shù), 一個無參數(shù),一個接受另一個 Collection。 第 3 個構
49、造函數(shù): ArrayList(int initialCapacity) 是 ArrayList 實現(xiàn)的比較重要的構 造函數(shù),雖然,我們不常用它,但是某認的構造函數(shù)正是調用的該帶參數(shù):in itialCapacity 的構造函數(shù)來實現(xiàn)的。 其中參數(shù): initialCapacity 表 示我們構造的這個ArrayList 列表的初始化容量是多大。如果調用默認的構造函 數(shù),則表示默認調用該參數(shù)為initialCapacity =10 的方式,來進行構建一 個 ArrayList 列表對象。 為了更好的理解這個initialCapacity 參數(shù)的概念,我們先看看Arra yList 在 Sun 提
50、供的源碼中的實現(xiàn)方式。先看一下它的屬性有哪些: ArrayList 繼承了 AbstractList 我們主要看看 ArrayList 中的屬性 就可以了。 ArrayList 中主要包含 2 個屬性: private transient Object elementData; private int size; 其中數(shù)組 ::elementData 是列表的實現(xiàn)核心屬性:數(shù)組。 我們使用 該數(shù)組來進行存放集合中的數(shù)據(jù)。而我們的初始化參數(shù)就是該數(shù)組構建時候的長度 ,即該數(shù)組的 length 屬性就是 initialCapacity 參數(shù)。 Keys:transient 表示被修飾的屬性不是對象
51、持久狀態(tài)的一部分,不會自動 的序列化 。 第 2 個屬性:size 表示列表中真實數(shù)據(jù)的存放個數(shù)。 我們再來看一下ArrayList 的構造函數(shù) ,加深一下 ArrayList 是基于數(shù) 組的理解。 從源碼中可以看到默認的構造函數(shù)調用的就是帶參數(shù)的構造函數(shù): public ArrayList(int initialCapacity) 不過參數(shù) initialCapacity10。 我們主要看 ArrayList(int initialCapacity)這個構造函數(shù)??梢?看到: t th hi is s. .e el le em me en nt tD Da at ta a = = n ne ew w O Ob bj je ec ct t i in ni it ti ia al lC Ca ap
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 年產3萬臺新能源汽車電機及1500臺風力發(fā)電機配套沖片項目可行性研究報告寫作模板-申批備案
- 2025-2030全球對稱槳行業(yè)調研及趨勢分析報告
- 2025-2030全球高速塑料理瓶機行業(yè)調研及趨勢分析報告
- 2025-2030全球磨削數(shù)控系統(tǒng)行業(yè)調研及趨勢分析報告
- 2025年全球及中國智能體測一體機行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025-2030全球活細胞代謝分析儀行業(yè)調研及趨勢分析報告
- 2025-2030全球臨床試驗實驗室服務行業(yè)調研及趨勢分析報告
- 2025年全球及中國生命科學智能制造服務行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025-2030全球無人機基礎設施檢查行業(yè)調研及趨勢分析報告
- 代辦服務合同
- 2025新人教版英語七年級下單詞表
- 中華護理學會團體標準-氣管切開非機械通氣患者氣道護理
- 未成年入職免責協(xié)議書
- 光伏電站巡檢專項方案
- 2024年山東省東營市中考數(shù)學試題 (原卷版)
- 公司員工外派協(xié)議書范文
- 信息科技重大版 七年級上冊 互聯(lián)網(wǎng)應用與創(chuàng)新 第二單元教學設計 互聯(lián)網(wǎng)原理
- 肺栓塞的護理查房完整版
- 手術患者手術部位標識制度
- 抖音麗人行業(yè)短視頻直播項目運營策劃方案
- (2024年)知識產權全套課件(完整)
評論
0/150
提交評論