深入Java_Java集合_第1頁
深入Java_Java集合_第2頁
深入Java_Java集合_第3頁
深入Java_Java集合_第4頁
深入Java_Java集合_第5頁
已閱讀5頁,還剩166頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Java集合集合學(xué)習(xí)要點(diǎn):學(xué)習(xí)要點(diǎn):p Java集合概述p Collection和Iterator接口p Set集合p List集合p Queue集合p Java8增強(qiáng)的Map集合p HashSet和HashMap的性能選項(xiàng)p 操作集合的工具類:Collectionsp 煩瑣的接口:Enumerationp 本章小結(jié)Java集合類是一種特別有用的工具類,可用于存儲(chǔ)數(shù)量不等集合類是一種特別有用的工具類,可用于存儲(chǔ)數(shù)量不等的對象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu),如棧、隊(duì)列等。除此之外的對象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu),如棧、隊(duì)列等。除此之外java集合還可用于保存具有映射關(guān)系的關(guān)聯(lián)數(shù)組。集合還可用于保存具

2、有映射關(guān)系的關(guān)聯(lián)數(shù)組。Java集合大致集合大致可分為可分為Set、List、Queue和和Map四種體系,其中四種體系,其中Set代表無序、代表無序、不可重復(fù)的集合;不可重復(fù)的集合;List代表有序、重復(fù)的集合;而代表有序、重復(fù)的集合;而Map則代表具則代表具有映射關(guān)系的集合。有映射關(guān)系的集合。Java5中又增加了中又增加了Queue體系集合,代表一體系集合,代表一種隊(duì)列集合實(shí)現(xiàn)。種隊(duì)列集合實(shí)現(xiàn)。第一節(jié)第一節(jié) Java集合概述集合概述p 為了保存數(shù)量不確定的數(shù)據(jù),以及保存具有映射關(guān)為了保存數(shù)量不確定的數(shù)據(jù),以及保存具有映射關(guān)系的數(shù)據(jù)(也稱為關(guān)聯(lián)素組),系的數(shù)據(jù)(也稱為關(guān)聯(lián)素組),Java提供了

3、集合類提供了集合類。集合類主要負(fù)責(zé)保存、盛裝其他數(shù)據(jù),因此集合。集合類主要負(fù)責(zé)保存、盛裝其他數(shù)據(jù),因此集合類也被稱為容器類。所有的集合類都位于類也被稱為容器類。所有的集合類都位于java.util包包下,后來為了處理多線程環(huán)境下的并發(fā)安全問題,下,后來為了處理多線程環(huán)境下的并發(fā)安全問題,java5還在還在java.util.concurrent包下提供了一些多線包下提供了一些多線程支持的集合類。程支持的集合類。p 集合類和數(shù)組不一樣,數(shù)組元素既可以是基本數(shù)據(jù)集合類和數(shù)組不一樣,數(shù)組元素既可以是基本數(shù)據(jù)類型,又可以是對象(實(shí)際上保存的是對象的引用類型,又可以是對象(實(shí)際上保存的是對象的引用變量)

4、;而集合只能保存對象。變量);而集合只能保存對象。p J a v a 的 集 合 類 主 要 由 兩 個(gè) 接 口 派 生 而 出 :的 集 合 類 主 要 由 兩 個(gè) 接 口 派 生 而 出 :Collection和和Map。Collection接口及其接口及其派生派生類類Map體系的繼承樹體系的繼承樹第二節(jié)第二節(jié) Collection和和Iteration接口接口Collection接口是接口是List、Set和和Queue接口的父接口,該接口接口的父接口,該接口里定義的方法既可用于操作里定義的方法既可用于操作Set集合,也可用于操作集合,也可用于操作List和和Queue集合。集合。Col

5、lection接口里定義了如下操作集合元素的方法接口里定義了如下操作集合元素的方法。p boolean add(Object o):用于向集合里添加一個(gè)元素,如果集合對象被添加操作改變了,則返回true。p boolean addAll(Collection c):該方法把集合c里的所有元素添加到指定集合里。如果集合對象被添加操作改變了,則返回true。p void clear():清除集合里所有元素,將集合長度變?yōu)?;p boolean contains(Object o):返回集合里是否包含指定元素。p boolean containsAll(Collection c):返回集合里是否包含

6、集合c里所有元素。p boolean isEmpty(): 返回集合是否為空。當(dāng)集合長度為0時(shí)返回true。否則返回false。p Iterator iterator():返回一個(gè)Iterator對象,用于遍歷集合里的元素。p boolean remove(Object o):從此 collection 中移除指定元素的單個(gè)實(shí)例,存在多個(gè)只刪除第一個(gè)。p boolean removeAll(Collection c):移除此 collection 中那些也包含在指定 c中的所有元素,如果刪除了一個(gè)或一個(gè)以上,則返回true。p boolean retainAll(Collection c):從

7、集合中刪除集合c里不包含的元素(相當(dāng)于把調(diào)用該方法的集合變成該集合和集合c的交集),如果該操作改變了調(diào)用該方法的集合,則該方法返回true。p int size():該方法返回集合里元素的個(gè)數(shù)。p Object toArray(): 該方法把集合轉(zhuǎn)換成一個(gè)數(shù)組,所有的集合元素變成對應(yīng)的數(shù)組元素。小練習(xí):小練習(xí):因?yàn)樗械囊驗(yàn)樗械腃ollection實(shí)現(xiàn)類實(shí)現(xiàn)類都重寫了都重寫了toString()方法,該方法,該方法可以一次性輸出集合中所方法可以一次性輸出集合中所有元素。有元素。上面程序中創(chuàng)建了兩個(gè)上面程序中創(chuàng)建了兩個(gè)Collection對象,一個(gè)是對象,一個(gè)是c集集合,一個(gè)是合,一個(gè)是boo

8、ks集合,其中集合,其中c集合是集合是ArrayList,而,而books集合是集合是HashSet。雖然他們使用的實(shí)現(xiàn)類不同,。雖然他們使用的實(shí)現(xiàn)類不同,但當(dāng)把他們當(dāng)成但當(dāng)把他們當(dāng)成Collection來使用時(shí),使用來使用時(shí),使用add, remove, clear等方法完全沒有任何區(qū)別。等方法完全沒有任何區(qū)別。1. 使用使用Lambda表達(dá)式遍歷集合表達(dá)式遍歷集合java8為為Iterable接口新增了一個(gè)接口新增了一個(gè)forEach (Consumer action)默認(rèn)方法,該方法所需參數(shù)的類型是一個(gè)函數(shù)默認(rèn)方法,該方法所需參數(shù)的類型是一個(gè)函數(shù)式接口,而式接口,而Iterable接口是

9、接口是Collection接口的父接口,接口的父接口,因此因此Collection集合也可以直接調(diào)用該方法。集合也可以直接調(diào)用該方法。當(dāng)程序調(diào)用當(dāng)程序調(diào)用Iterable的的forEach(Consumer action)遍遍歷集合元素時(shí),程序會(huì)依次將集合元素傳給歷集合元素時(shí),程序會(huì)依次將集合元素傳給Consumer的的accept(T,t)方法(該接口中唯一的抽象方法)。)方法(該接口中唯一的抽象方法)。正因?yàn)檎驗(yàn)镃onsumer是函數(shù)式接口,因此可以使用是函數(shù)式接口,因此可以使用Lambda表達(dá)式來遍歷集合元素。表達(dá)式來遍歷集合元素。2. 使用使用foreach循環(huán)遍歷集合元素循環(huán)遍歷集

10、合元素除了可以使用除了可以使用Iterator接口迭代訪問接口迭代訪問Collection集合里集合里的元素之外,使用的元素之外,使用Java5提供的提供的foreach循環(huán)迭代訪問循環(huán)迭代訪問集合元素更加便捷。集合元素更加便捷。Collection books = new HashSet();books.add(JavaEE);books.add(Android);/使用foreach循環(huán)來迭代訪問Collection集合元素for(Object obj:books)String book = (String)obj;System.out.println(book);3. 使用使用Java8

11、新增的新增的Predicate操作集合操作集合Java8為為Collection集合新增了一個(gè)集合新增了一個(gè)removeIf(Predicate filter)方法,該方法見鬼批量刪除符合)方法,該方法見鬼批量刪除符合filter條件的所有元素。該方法需要一個(gè)條件的所有元素。該方法需要一個(gè)Predicate(謂詞謂詞)對對象作為參數(shù),象作為參數(shù),Predicate也是函數(shù)式接口,因此可是用也是函數(shù)式接口,因此可是用Lambda表示式作為參數(shù)。表示式作為參數(shù)。4.使用使用Java8新增的新增的Stream操作集合操作集合Java8還新增了還新增了Stream、InStream、LongStrea

12、m、DoubleStream等流式等流式API,這些,這些API代表多個(gè)支持串代表多個(gè)支持串行和并行聚集操作的元素。行和并行聚集操作的元素。Stream是一個(gè)通用的流接是一個(gè)通用的流接口,而口,而IntStream、LongStream、DoubleStream則則代表元素類型為代表元素類型為int、long、double的流。的流。Java8還為上面每個(gè)流式還為上面每個(gè)流式API提供了對應(yīng)的提供了對應(yīng)的Builder,例如,例如Stream.Builder, IntStream.Builder, LongBuilder, DoubleStream.Builder, 開發(fā)者可以通開發(fā)者可以通過

13、這些過這些Builder來創(chuàng)建對應(yīng)的流。來創(chuàng)建對應(yīng)的流。獨(dú)立使用獨(dú)立使用Stream的步驟如下:的步驟如下: 使用使用Stream或或XXXStream的的builder()類方法創(chuàng)()類方法創(chuàng)建建Stream對應(yīng)的對應(yīng)的Builder。 重復(fù)調(diào)用重復(fù)調(diào)用Builder的的add()方法向該流中添加多個(gè)()方法向該流中添加多個(gè)元素。元素。 調(diào)用調(diào)用Builder的的builder()方法獲取該流中添加多個(gè)()方法獲取該流中添加多個(gè)元素。元素。 調(diào)用調(diào)用Stream的聚集方法。的聚集方法。實(shí)例:實(shí)例:注意:注意:IntStream的聚集方法只能執(zhí)行一次。的聚集方法只能執(zhí)行一次。Stream提供了

14、大量的方法進(jìn)行聚集操作,這些方法既提供了大量的方法進(jìn)行聚集操作,這些方法既可以是可以是“中間的中間的”(intermediate),也可以是也可以是“末端的末端的”(terminal)。)。中間方法:中間操作允許流保持打開狀態(tài),并允許直中間方法:中間操作允許流保持打開狀態(tài),并允許直接調(diào)用后續(xù)方法。上面程序中的接調(diào)用后續(xù)方法。上面程序中的map()方法就是中間方方法就是中間方法。中間方法的返回值是另外一個(gè)流。法。中間方法的返回值是另外一個(gè)流。末端方法:末端方法是對流的最終操作,當(dāng)對某個(gè)末端方法:末端方法是對流的最終操作,當(dāng)對某個(gè)Stream執(zhí)行末端方法后,該流將會(huì)被執(zhí)行末端方法后,該流將會(huì)被“消

15、耗消耗”且不可且不可再用。上面程序的再用。上面程序的sum(),count(),average()等就是末端等就是末端流的方法還有如下兩個(gè)特征:流的方法還有如下兩個(gè)特征: 有狀態(tài)的方法:這種方法會(huì)給流增加一些新的屬性有狀態(tài)的方法:這種方法會(huì)給流增加一些新的屬性,比如元素的唯一性、元素的最大數(shù)量、保證元素,比如元素的唯一性、元素的最大數(shù)量、保證元素以排序的方式被處理等。有狀態(tài)的方法往往需要更以排序的方式被處理等。有狀態(tài)的方法往往需要更大的性能開銷。大的性能開銷。 短路方法:短路方法可以盡早結(jié)束對流的操作,不短路方法:短路方法可以盡早結(jié)束對流的操作,不必檢查所有的元素。必檢查所有的元素。介紹一下介

16、紹一下Stream常用的方法:常用的方法:p filter(Predicate predicate):過濾過濾Stream中所有不符中所有不符合合predicate的元素。的元素。p mapToXxx(ToXxxFunction mapper):使用使用ToXxxFunction對流中的元素執(zhí)行一對一的轉(zhuǎn)換。對流中的元素執(zhí)行一對一的轉(zhuǎn)換。p peek(Consumer action):依次對每個(gè)元素執(zhí)行一些依次對每個(gè)元素執(zhí)行一些操作,該方法返回的流與原有流包含相同的元素。操作,該方法返回的流與原有流包含相同的元素。該方法主要用于調(diào)試。該方法主要用于調(diào)試。p distinct():該方法用于排序

17、流中所有重復(fù)的元素(:該方法用于排序流中所有重復(fù)的元素(判斷元素重復(fù)的標(biāo)準(zhǔn)是使用判斷元素重復(fù)的標(biāo)準(zhǔn)是使用equals()比較返回比較返回true)。這是一個(gè)有狀態(tài)的方法。這是一個(gè)有狀態(tài)的方法。p sorted():該方法用于保證流中的元素在后續(xù)的訪問該方法用于保證流中的元素在后續(xù)的訪問中處于有序狀態(tài)。這是一個(gè)有狀態(tài)的方法。中處于有序狀態(tài)。這是一個(gè)有狀態(tài)的方法。p limit(long maxSize):該方法用于保證對該流的后續(xù)該方法用于保證對該流的后續(xù)訪問中最大允許訪問的元素個(gè)數(shù)。這是一個(gè)有狀態(tài)訪問中最大允許訪問的元素個(gè)數(shù)。這是一個(gè)有狀態(tài)的、短路的方法。的、短路的方法。Stream常用的末端

18、方法常用的末端方法p forEach(Consumer action):遍歷流中所有元素,遍歷流中所有元素,對每個(gè)元素執(zhí)行對每個(gè)元素執(zhí)行action。p toArray():將流中所有元素轉(zhuǎn)換為一個(gè)數(shù)組。將流中所有元素轉(zhuǎn)換為一個(gè)數(shù)組。p reduce():該方法有三個(gè)重載的版本,都用于通過某該方法有三個(gè)重載的版本,都用于通過某種操作來合并流中的元素。種操作來合并流中的元素。p min():返回流中所有元素的最小值。:返回流中所有元素的最小值。p max():返回流中所有元素的最大值。:返回流中所有元素的最大值。p count():返回流中所有元素的數(shù)量。返回流中所有元素的數(shù)量。p anyMat

19、ch(Predicate predicate):判斷流中是否至:判斷流中是否至少包含一個(gè)元素符號符合少包含一個(gè)元素符號符合Predicate條件。條件。p allMatch(Prediacate predicate):判斷流中是否每個(gè)判斷流中是否每個(gè)元素都符合元素都符合Predicate條件。條件。p noneMatch(Predicate predicate):判斷流中是否所判斷流中是否所有元素都不符合有元素都不符合Predicate條件。條件。p findFirst():返回流中的第一個(gè)元素。返回流中的第一個(gè)元素。p findAny():返回流中的任意一個(gè)元素。返回流中的任意一個(gè)元素。除此

20、之外,除此之外,Java 8 允許使用流式允許使用流式API來操作集合,來操作集合,Collection接口提供了一個(gè)接口提供了一個(gè)Stream()默認(rèn)方法,該方法默認(rèn)方法,該方法可返回該集合對應(yīng)的流,接下來計(jì)科通過流式可返回該集合對應(yīng)的流,接下來計(jì)科通過流式API來操來操作集合元素。由于作集合元素。由于Stream可以對集合元素進(jìn)行整體的可以對集合元素進(jìn)行整體的聚集操作,因此聚集操作,因此Stream極極大地豐富了集合的功能。大地豐富了集合的功能。實(shí)例:實(shí)例:第三節(jié)第三節(jié) Set集合集合set集合類似一個(gè)罐子,程序可以一次把對象丟進(jìn)集合類似一個(gè)罐子,程序可以一次把對象丟進(jìn)set集合,而集合,

21、而set集合通常不能記住元素的添加順序。集合通常不能記住元素的添加順序。Set集集合與合與Collection基本相同,沒有提供任何額外的方法?;鞠嗤?,沒有提供任何額外的方法。實(shí)際上實(shí)際上Set就是就是Collection,只是行為略有不同。,只是行為略有不同。set集合不允許包含相同元素,如果試圖把兩個(gè)相同的集合不允許包含相同元素,如果試圖把兩個(gè)相同的元素加入同一個(gè)元素加入同一個(gè)Set集合中,則添加操作失敗,集合中,則添加操作失敗,add()方方法返回法返回false,且新元素不會(huì)被加入。,且新元素不會(huì)被加入。上面介紹的是上面介紹的是set集合的通用知識,因此完全適合后面集合的通用知識,因

22、此完全適合后面介紹的介紹的HashSet、TreeSet和和EnumSet三個(gè)實(shí)現(xiàn)類。只三個(gè)實(shí)現(xiàn)類。只是三個(gè)實(shí)現(xiàn)類還各有特色。是三個(gè)實(shí)現(xiàn)類還各有特色。1.HashSet類類HashSet是是set接口的典型實(shí)現(xiàn),大多數(shù)時(shí)候使用接口的典型實(shí)現(xiàn),大多數(shù)時(shí)候使用Set集合時(shí)就是使用這個(gè)實(shí)現(xiàn)類。集合時(shí)就是使用這個(gè)實(shí)現(xiàn)類。HashSet按按Hash算法來算法來存儲(chǔ)集合中的元素,因此據(jù)很好的存儲(chǔ)和查找性能。存儲(chǔ)集合中的元素,因此據(jù)很好的存儲(chǔ)和查找性能。HashSet具有以下特點(diǎn):具有以下特點(diǎn):p 不能保證元素的排列順序,順序可能與添加順序不不能保證元素的排列順序,順序可能與添加順序不同,順序也有可能發(fā)生變

23、化。同,順序也有可能發(fā)生變化。p HashSet不是同步的,如果多個(gè)線程同時(shí)訪問一個(gè)不是同步的,如果多個(gè)線程同時(shí)訪問一個(gè)HashSet,假設(shè)有兩個(gè)或者兩個(gè)以上線程同時(shí)修改,假設(shè)有兩個(gè)或者兩個(gè)以上線程同時(shí)修改了了HashSet集合時(shí),必須通過代碼來保證其同步。集合時(shí),必須通過代碼來保證其同步。p 集合元素值可以是集合元素值可以是null。當(dāng)向當(dāng)向HashSet集合中存入一個(gè)元素時(shí),集合中存入一個(gè)元素時(shí),HashSet會(huì)調(diào)會(huì)調(diào)用 該 對 象 的用 該 對 象 的 h a s h C o d e ( ) 方 法 來 得 到 該 對 象 的方 法 來 得 到 該 對 象 的hashCode()值,然后

24、根據(jù)該值,然后根據(jù)該hashCode值決定該對象值決定該對象在在HashSet中的存儲(chǔ)位置。如果有兩個(gè)元素通過中的存儲(chǔ)位置。如果有兩個(gè)元素通過equals()方法比較返回方法比較返回true,但它們的但它們的hasCode()方法返方法返回值不同,回值不同,HashSet將會(huì)把他們存儲(chǔ)在不同的位置,依將會(huì)把他們存儲(chǔ)在不同的位置,依然可以添加成功然可以添加成功。也就是說,也就是說,HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對象通過兩個(gè)對象通過equals()方法比較相等,并且兩個(gè)對象的方法比較相等,并且兩個(gè)對象的hashCode()方法返回值也相等。方法返回值也相

25、等。如果兩個(gè)對象的如果兩個(gè)對象的hashCode()方法返回的方法返回的hasCode值相同,但他們通過值相同,但他們通過equals()方法比較返回方法比較返回false時(shí)更加時(shí)更加麻煩:因?yàn)閮蓚€(gè)對象的麻煩:因?yàn)閮蓚€(gè)對象的hasCode()值相同,值相同,HashSet將將試圖把他們保存在同一個(gè)位置,但又不行(否則將只剩試圖把他們保存在同一個(gè)位置,但又不行(否則將只剩下一個(gè)對象),所以實(shí)際上會(huì)在這個(gè)位置用鏈?zhǔn)浇Y(jié)構(gòu)來下一個(gè)對象),所以實(shí)際上會(huì)在這個(gè)位置用鏈?zhǔn)浇Y(jié)構(gòu)來保存多個(gè)對象;而保存多個(gè)對象;而HashSet訪問集合元素時(shí)也是根據(jù)元訪問集合元素時(shí)也是根據(jù)元素的素的hashCode值來快速定位的

26、,如果值來快速定位的,如果HashSet中兩個(gè)中兩個(gè)以上的元素具有相同的以上的元素具有相同的hashCode值,將會(huì)導(dǎo)致性能下值,將會(huì)導(dǎo)致性能下降。降。如果兩個(gè)對象通過如果兩個(gè)對象通過equals()方法返回方法返回true,但這兩,但這兩個(gè)對象的個(gè)對象的hashCode()返回不同的返回不同的hasCode()值時(shí),這值時(shí),這將導(dǎo)致將導(dǎo)致HashSet會(huì)把這兩個(gè)對象保存在會(huì)把這兩個(gè)對象保存在Hash表中的不表中的不同位置,從而使兩個(gè)對象都可以添加成功,這就與同位置,從而使兩個(gè)對象都可以添加成功,這就與Set集合的規(guī)則沖突了。集合的規(guī)則沖突了。如果需要把某個(gè)類的對象保存到如果需要把某個(gè)類的對象

27、保存到HashSet集合中,集合中,重寫這個(gè)類的重寫這個(gè)類的equals()方法和方法和hashCode()方法時(shí),應(yīng)方法時(shí),應(yīng)該盡量保證兩個(gè)對象通過該盡量保證兩個(gè)對象通過equals()方法比較返回方法比較返回true時(shí)時(shí),它們的,它們的hasCode()方法返回值也相同。方法返回值也相同。HashSet中每個(gè)能存儲(chǔ)元素的中每個(gè)能存儲(chǔ)元素的“槽位槽位”(slot)通)通常稱為常稱為“桶桶”(bucket),如果有多個(gè)元素的),如果有多個(gè)元素的hashCode值相同,但它們通過值相同,但它們通過equals()方法比較返回方法比較返回false,就需要在一個(gè),就需要在一個(gè)“桶桶”里放多個(gè)元素,

28、這樣就會(huì)里放多個(gè)元素,這樣就會(huì)導(dǎo)致性能下降。導(dǎo)致性能下降。重寫重寫hashCode()方法的基本規(guī)則方法的基本規(guī)則p 在 程 序 運(yùn) 行 過 程 中 , 同 一 個(gè) 對 象 多 次 調(diào) 用在 程 序 運(yùn) 行 過 程 中 , 同 一 個(gè) 對 象 多 次 調(diào) 用hashCode()方法應(yīng)該返回相同的值。方法應(yīng)該返回相同的值。p 當(dāng)兩個(gè)對象通過當(dāng)兩個(gè)對象通過equals()方法返回方法返回true時(shí),這兩個(gè)對時(shí),這兩個(gè)對象的象的hashCode()方法應(yīng)該返回相同的值。方法應(yīng)該返回相同的值。p 對象中用作對象中用作equals()方法比較標(biāo)準(zhǔn)的實(shí)例變量,都應(yīng)方法比較標(biāo)準(zhǔn)的實(shí)例變量,都應(yīng)該用于計(jì)算該用

29、于計(jì)算hashCode重寫重寫hashCode的一般步驟的一般步驟1.把對象內(nèi)每個(gè)有意義的實(shí)例變量(即每個(gè)參與把對象內(nèi)每個(gè)有意義的實(shí)例變量(即每個(gè)參與equals()方法比較標(biāo)準(zhǔn)的實(shí)例變量)計(jì)算出一個(gè)方法比較標(biāo)準(zhǔn)的實(shí)例變量)計(jì)算出一個(gè)int類型類型的的hasCode值。值。hashCode的計(jì)算方式的計(jì)算方式實(shí)例變量類型實(shí)例變量類型計(jì)算方式計(jì)算方式實(shí)例變量類型實(shí)例變量類型計(jì)算方式計(jì)算方式booleanhashCode=(f?0:1)floathashCode=Float.floatToIntBirs(f)整數(shù)類型(byte,short, char,int)hashCode=(int)fdoub

30、lelong1=Double.doubleToLongBits(f)hashCode=(int)(1(132);longhashCode=(int)(f(f32)引用類型hashCode=f.hashCode()2. 用第一步計(jì)算出來的多個(gè)用第一步計(jì)算出來的多個(gè)hashCode值組合計(jì)算出值組合計(jì)算出一個(gè)一個(gè)hashCode值返回。值返回。例如:例如:return f1.hashCode()+(int)f2;為了避免直接相加產(chǎn)生偶然相等(兩個(gè)對象的為了避免直接相加產(chǎn)生偶然相等(兩個(gè)對象的f1,f2實(shí)實(shí)例變量并不相等例變量并不相等,但他們的但他們的hashCode的和恰好相等),的和恰好相等),

31、可以通過為各實(shí)例變量的可以通過為各實(shí)例變量的hashCode值乘以任意一個(gè)質(zhì)值乘以任意一個(gè)質(zhì)數(shù)再相加。例如如下代碼:數(shù)再相加。例如如下代碼:return f1.hashCode()*19+(int)f2*31;如果想如果想HashSet中添加一個(gè)可變對象后,后面程序修中添加一個(gè)可變對象后,后面程序修改了該可變對象的實(shí)例變量,則可能導(dǎo)致它與集合中的改了該可變對象的實(shí)例變量,則可能導(dǎo)致它與集合中的其他元素相同(即兩個(gè)對象通過其他元素相同(即兩個(gè)對象通過equals()方法比較返回方法比較返回true,兩個(gè)對象的,兩個(gè)對象的hashCode值也相等),這就有可能值也相等),這就有可能導(dǎo)致導(dǎo)致Hash

32、Set中包含兩個(gè)相同的對象。中包含兩個(gè)相同的對象。實(shí)例實(shí)例由上面的例子可見,當(dāng)程序把可變對象添加到由上面的例子可見,當(dāng)程序把可變對象添加到HashSet中之后,盡量不要去修改該集合元素中參與計(jì)中之后,盡量不要去修改該集合元素中參與計(jì)算算hashCode()、equals()的實(shí)例變量,否則將會(huì)導(dǎo)致的實(shí)例變量,否則將會(huì)導(dǎo)致HashSet無法正確操作這些集合元素。無法正確操作這些集合元素。2. LinkedHashSet類類HashSet還有一個(gè)子類還有一個(gè)子類LinkedHashSet,LinkedHashSet集合也是根據(jù)元素的集合也是根據(jù)元素的hashCode值來決值來決定元素的存儲(chǔ)位置,但

33、它同時(shí)使用鏈表維護(hù)元素的次序定元素的存儲(chǔ)位置,但它同時(shí)使用鏈表維護(hù)元素的次序,這樣使得元素看起來是以插入的順序保存的。也就是,這樣使得元素看起來是以插入的順序保存的。也就是說,當(dāng)遍歷說,當(dāng)遍歷LinkedHashSet集合里的元素時(shí),集合里的元素時(shí),LinkedHashSet將會(huì)按元素的添加順序來訪問集合里將會(huì)按元素的添加順序來訪問集合里的元素。的元素。LinkedHashSet需要維護(hù)元素的插入順序,因此性需要維護(hù)元素的插入順序,因此性能略低于能略低于HashSet的性能,但在迭代訪問的的性能,但在迭代訪問的Set里的全里的全部元素是有很好的性能,因?yàn)樗枣湵韥砭S護(hù)內(nèi)部順序部元素是有很好的性

34、能,因?yàn)樗枣湵韥砭S護(hù)內(nèi)部順序。實(shí)例實(shí)例輸入輸入LinkedHashSet集合的元素時(shí),元素的順序總是集合的元素時(shí),元素的順序總是與添加順序一致。與添加順序一致。3. TreeSet類類TreeSet是是SortedSet接口的實(shí)現(xiàn)類,正如接口的實(shí)現(xiàn)類,正如SortedSet名字所暗示的,名字所暗示的,TreeSet可以確保集合元素可以確保集合元素處于排序狀態(tài)。與處于排序狀態(tài)。與HashSet集合相比,集合相比,TreeSet還提供還提供了幾個(gè)額外的方法:了幾個(gè)額外的方法:p Comparator comparator():如果如果TreeSet采用了定采用了定制 排 序 , 則 該 方 法

35、返 回 定 制 排 序 所 使 用 的制 排 序 , 則 該 方 法 返 回 定 制 排 序 所 使 用 的Comparator();如果;如果TreeSet采用了自然排序,則采用了自然排序,則返回返回null。p Object first():返回集合中的第一個(gè)元素。返回集合中的第一個(gè)元素。p Object last():返回集合中的最后一個(gè)元素。返回集合中的最后一個(gè)元素。p Object lower(Object e):返回集合中位于指定元素返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,參考元之前的元素(即小于指定元素的最大元素,參考元素不需要是素不需要是TreeSet集合里

36、的元素)。集合里的元素)。p Object higher(Object e):返回集合中為與指定元素返回集合中為與指定元素之后的元素(即大于指定元素的最小元素,參考元之后的元素(即大于指定元素的最小元素,參考元素不需要是素不需要是TreeSet集合里的元素)。集合里的元素)。p SortedSet subSet(Object fromElement, Object t o E l e m e n t ) : 返 回 此返 回 此 S e t 的 子 集 合 , 范 圍 從的 子 集 合 , 范 圍 從fromElement(包含包含)到)到toElement(不包含)。(不包含)。p Sort

37、edSet headSet(Object toElement):返回此返回此Set的子集,由小于的子集,由小于toElement的元素組成。的元素組成。p SortedSet tailSet(Object fromElement):返回此返回此Set的子集,由大于或等于的子集,由大于或等于formElement的元素組成的元素組成。提示:表面上看起來這些方法很多,其實(shí)他們很簡單:因?yàn)樘崾荆罕砻嫔峡雌饋磉@些方法很多,其實(shí)他們很簡單:因?yàn)門reeSet中的元素是有序的,所以增加了訪問第一個(gè),前一個(gè),中的元素是有序的,所以增加了訪問第一個(gè),前一個(gè),后一個(gè),最后一個(gè)元素的方法,并提供了三個(gè)從后一個(gè),最

38、后一個(gè)元素的方法,并提供了三個(gè)從TreeSet中截取中截取子子TreeSet的方法。的方法。練習(xí)練習(xí)與與HashSet集合采用集合采用Hash算法來決定元素的存儲(chǔ)位算法來決定元素的存儲(chǔ)位置不同,置不同,TreeSet采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來春初集合元采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)來春初集合元素。那么素。那么TreeSet進(jìn)行排序的規(guī)則是怎么樣的呢?進(jìn)行排序的規(guī)則是怎么樣的呢?TreeSet支持兩種排序方法:自然排序和定制排序。在支持兩種排序方法:自然排序和定制排序。在默認(rèn)情況下,默認(rèn)情況下,TreeSet采用自然排序采用自然排序。自然排序自然排序TreeSet會(huì)調(diào)用集合元素的會(huì)調(diào)用集合元素的compare

39、To(Object obj)方法來比較元素之間的大小關(guān)系,然后將集合元素方法來比較元素之間的大小關(guān)系,然后將集合元素按升序排列,這種方法就是自然排序。按升序排列,這種方法就是自然排序。java提供了一個(gè)提供了一個(gè)Comparable接口,該接口里定義接口,該接口里定義了一個(gè)了一個(gè)compareTo(Object obj)方法,該方法返回一個(gè)方法,該方法返回一個(gè)整數(shù)值,實(shí)現(xiàn)該接口的類必須實(shí)現(xiàn)該方法,實(shí)現(xiàn)了該接整數(shù)值,實(shí)現(xiàn)該接口的類必須實(shí)現(xiàn)該方法,實(shí)現(xiàn)了該接口的類的對象就可以比較大小。當(dāng)一個(gè)對象調(diào)用該方法口的類的對象就可以比較大小。當(dāng)一個(gè)對象調(diào)用該方法與 另 一 個(gè) 對 象 進(jìn) 行 比 較 時(shí) ,

40、 例 如與 另 一 個(gè) 對 象 進(jìn) 行 比 較 時(shí) , 例 如pareTo(obj2),如果該方法返回,如果該方法返回0,則表明這,則表明這兩個(gè)對象相等;如果該方法返回一個(gè)正整數(shù),則表明兩個(gè)對象相等;如果該方法返回一個(gè)正整數(shù),則表明obj1obj2;如果該方法返回一個(gè)負(fù)整數(shù),則表明如果該方法返回一個(gè)負(fù)整數(shù),則表明obj1o2;如果該方法返回;如果該方法返回0,則表,則表明明01=02;如果該方法返回負(fù)整數(shù),則表明如果該方法返回負(fù)整數(shù),則表明o102;如果需要實(shí)現(xiàn)定制排序則需要在創(chuàng)建如果需要實(shí)現(xiàn)定制排序則需要在創(chuàng)建TreeSet集合對象時(shí),集合對象時(shí),提供一個(gè)提供一個(gè)Comparator對象與該

41、對象與該TreeSet集合關(guān)聯(lián),由該集合關(guān)聯(lián),由該Comparator對象負(fù)責(zé)集合元素的排序邏輯。由于對象負(fù)責(zé)集合元素的排序邏輯。由于Comparator是一個(gè)函數(shù)式接口,因此,可以使用是一個(gè)函數(shù)式接口,因此,可以使用Lambda表達(dá)式來代替表達(dá)式來代替Comparator表達(dá)式。表達(dá)式。實(shí)例實(shí)例從大到小排序:從大到小排序:上 面 程 序 中 粗 體 字 部 分 使 用 了 目 標(biāo) 類 型 為上 面 程 序 中 粗 體 字 部 分 使 用 了 目 標(biāo) 類 型 為Comparator的的Lambda表達(dá)式,它負(fù)責(zé)表達(dá)式,它負(fù)責(zé)tsSet集合的排集合的排序。所以當(dāng)把序。所以當(dāng)把M對象添加到對象添加

42、到ts集合中時(shí),無須集合中時(shí),無須M類實(shí)現(xiàn)類實(shí)現(xiàn)Comparator接口,因?yàn)榇藭r(shí)接口,因?yàn)榇藭r(shí)TreeSet無須通過無須通過M對象對象本身來比較大小,而是由與本身來比較大小,而是由與TreeSet關(guān)聯(lián)的關(guān)聯(lián)的Lambda表表達(dá)式負(fù)責(zé)集合元素的排序。達(dá)式負(fù)責(zé)集合元素的排序。注意:注意:當(dāng)通過當(dāng)通過Comparator對象(或?qū)ο螅ɑ騆ambda表達(dá)式)來實(shí)表達(dá)式)來實(shí)現(xiàn)現(xiàn)TreeSet的定制排序時(shí),依然不可以向的定制排序時(shí),依然不可以向TreeSet中添中添加類型不同的對象,否則會(huì)引發(fā)加類型不同的對象,否則會(huì)引發(fā)ClassCastException異常,使用定制排序時(shí),異常,使用定制排序時(shí),T

43、reeSet對集合元素排序不管對集合元素排序不管集合元素本省的大小,而是由集合元素本省的大小,而是由Comparator對象(或?qū)ο螅ɑ騆ambda表達(dá)式)負(fù)責(zé)集合元素的排序規(guī)則。表達(dá)式)負(fù)責(zé)集合元素的排序規(guī)則。TreeSet判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是:通過判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是:通過Comparator(或(或Lambda表達(dá)式)比較連個(gè)元素返回了表達(dá)式)比較連個(gè)元素返回了0,這樣,這樣TreeSet不會(huì)把第二個(gè)元素添加到集合中。不會(huì)把第二個(gè)元素添加到集合中。4. EnumSet類類EnumSet是一個(gè)專為枚舉類設(shè)計(jì)的集合類,是一個(gè)專為枚舉類設(shè)計(jì)的集合類,EnumSet中的所有元素都必須是指

44、定枚舉類型的枚舉中的所有元素都必須是指定枚舉類型的枚舉值,該枚舉類型在創(chuàng)建值,該枚舉類型在創(chuàng)建EnumSet時(shí)顯式或隱式的地指時(shí)顯式或隱式的地指定。定。EnumSet的集合元素也是有序的,的集合元素也是有序的,EnumSet以枚以枚舉值在舉值在Enum類內(nèi)的定義順序來決定集合元素的順序。類內(nèi)的定義順序來決定集合元素的順序。EnumSet在內(nèi)部以位向量的形式存儲(chǔ),這種存儲(chǔ)形在內(nèi)部以位向量的形式存儲(chǔ),這種存儲(chǔ)形式非常緊湊、高效,因此式非常緊湊、高效,因此EnumSet對象占用內(nèi)存很小對象占用內(nèi)存很小,而且運(yùn)行效率很好。尤其是進(jìn)行批量操作(如調(diào)用,而且運(yùn)行效率很好。尤其是進(jìn)行批量操作(如調(diào)用cont

45、ainsAll()和和retainAll())時(shí),如果其參數(shù)也是)時(shí),如果其參數(shù)也是EnumSet集合,則該批量操作的執(zhí)行速度也非???。集合,則該批量操作的執(zhí)行速度也非常快。EnumSet集合不允許加入集合不允許加入null元素,如果試圖插入元素,如果試圖插入null元素,元素,EnumSet將拋出將拋出NullPointerException異異常。如果只是想判斷常。如果只是想判斷EnumSet是否包含是否包含NULL元素或試元素或試圖刪除圖刪除null元素都不會(huì)拋出異常,只是刪除操作將返回元素都不會(huì)拋出異常,只是刪除操作將返回false,因?yàn)闆]有任何,因?yàn)闆]有任何NULL元素被刪除。元素被

46、刪除。EnumSet類沒有暴露任何構(gòu)造器來創(chuàng)建該類的實(shí)例類沒有暴露任何構(gòu)造器來創(chuàng)建該類的實(shí)例,程序應(yīng)該通過他提供的類方法來創(chuàng)建,程序應(yīng)該通過他提供的類方法來創(chuàng)建EnumSet對象對象。E n u m S e t 類 提 供 了 如 下 常 用 的 類 方 法 來 創(chuàng) 建類 提 供 了 如 下 常 用 的 類 方 法 來 創(chuàng) 建EnumSet對象。對象。p EnumSet allOf(Class elementType):創(chuàng)建一個(gè)包含創(chuàng)建一個(gè)包含指定枚舉類里所有枚舉值得指定枚舉類里所有枚舉值得EnumSet集合。集合。p EnumSet complementOf(EnumSet s):創(chuàng)建一個(gè)其

47、創(chuàng)建一個(gè)其元素類型與指定元素類型與指定EnumSet里元素類型相同的里元素類型相同的EnumSet集合,新集合,新EnumSet集合包含原集合包含原EnumSet集合所不包含的、此枚舉類剩下的枚舉值。集合所不包含的、此枚舉類剩下的枚舉值。p EnumSet copyOf(Collection c):使用一個(gè)普通集合使用一個(gè)普通集合來創(chuàng)建來創(chuàng)建EnumSet集合。集合。p EnumSet copyOf(EnumSet s):創(chuàng)建一個(gè)與指定創(chuàng)建一個(gè)與指定EnumSet具有相同元素類型、相同集合元素的具有相同元素類型、相同集合元素的EnumSet集合。集合。p EnumSet noneOf(Clas

48、s elementType):創(chuàng)建一個(gè)創(chuàng)建一個(gè)元素類型為指定枚舉類型的空元素類型為指定枚舉類型的空EnumSet。p EnumSet of(E first, E. rest):創(chuàng)建一個(gè)包含一個(gè)或創(chuàng)建一個(gè)包含一個(gè)或多個(gè)枚舉值的多個(gè)枚舉值的EnumSet集合,傳入的多個(gè)枚舉值必集合,傳入的多個(gè)枚舉值必須屬于同一個(gè)枚舉類。須屬于同一個(gè)枚舉類。p EnumSet range(E from, E to):創(chuàng)建一個(gè)包含從:創(chuàng)建一個(gè)包含從from枚舉值到枚舉值到to枚舉值范圍內(nèi)所有枚舉值的枚舉值范圍內(nèi)所有枚舉值的EnumSet集合。集合。實(shí)例實(shí)例除了以上實(shí)例的方法,還可以復(fù)制另一個(gè)除了以上實(shí)例的方法,還可以

49、復(fù)制另一個(gè)EnumSet集合中的所有元素來創(chuàng)建新的集合中的所有元素來創(chuàng)建新的EnumSet集合,或者復(fù)集合,或者復(fù)制另一個(gè)制另一個(gè)Collection集合中的所有元素來創(chuàng)建新的集合中的所有元素來創(chuàng)建新的EnumSet集合。當(dāng)復(fù)制集合。當(dāng)復(fù)制Collection集合中的所有元素集合中的所有元素來創(chuàng)建新的來創(chuàng)建新的EnumSet集合是,集合是,要求要求Collection集合中集合中的所有元素必須是同一個(gè)枚舉類型的枚舉值的所有元素必須是同一個(gè)枚舉類型的枚舉值,否則就會(huì),否則就會(huì)發(fā)生發(fā)生ClassCastException異常。異常。實(shí)例實(shí)例5. 各各Set實(shí)現(xiàn)類的性能分析實(shí)現(xiàn)類的性能分析HashS

50、et和和TreeSet是是Set的兩個(gè)典型實(shí)現(xiàn),到底如的兩個(gè)典型實(shí)現(xiàn),到底如何選擇何選擇HashSet和和TreeSet呢?呢?HashSet的性能總是比的性能總是比TreeSet好(特別是最常用的添加、查詢元素等操作)好(特別是最常用的添加、查詢元素等操作),因?yàn)?,因?yàn)門reeSet需要額外的紅黑樹算法來維護(hù)集合元素需要額外的紅黑樹算法來維護(hù)集合元素的次序。只有當(dāng)需要一個(gè)保存排序的的次序。只有當(dāng)需要一個(gè)保存排序的Set是,才應(yīng)該使是,才應(yīng)該使用用TreeSet,否則都應(yīng)該使用,否則都應(yīng)該使用HashSet。HashSet還有一個(gè)子類:還有一個(gè)子類:LinkedHashSet,但它只,但它只能

51、保存同一個(gè)枚舉類值作為集合元素。能保存同一個(gè)枚舉類值作為集合元素。必須指出的是,必須指出的是,set的三個(gè)實(shí)現(xiàn)類的三個(gè)實(shí)現(xiàn)類HashSet、TreeSet和和EnumSet都是線程不安全的。如果有多個(gè)線都是線程不安全的。如果有多個(gè)線程同時(shí)訪問一個(gè)程同時(shí)訪問一個(gè)Set集合,并且有超過一個(gè)線程修改了集合,并且有超過一個(gè)線程修改了該該Set集合,則必須手動(dòng)保證該集合,則必須手動(dòng)保證該Set集合的同步性。通常集合的同步性。通??梢酝ㄟ^可以通過Collection工具類的工具類的synchronizedSortedSet方法來方法來“包裝包裝”該該Set集合。此操作最好在創(chuàng)建時(shí)進(jìn)行集合。此操作最好在創(chuàng)建

52、時(shí)進(jìn)行,以防止對,以防止對Set集合的意外非同步訪問。例如:集合的意外非同步訪問。例如:SortedSet s = Collections.synchronizedSortedSet (new TreeSet(.);第四節(jié)第四節(jié) List集合集合List集合代表一個(gè)元素有序、可重復(fù)的集合,集合集合代表一個(gè)元素有序、可重復(fù)的集合,集合中每個(gè)元素都有其對應(yīng)的順序索引。中每個(gè)元素都有其對應(yīng)的順序索引。List集合允許使用集合允許使用重復(fù)元素,可以通過索引來訪問來訪問指定的集合元素重復(fù)元素,可以通過索引來訪問來訪問指定的集合元素。List集合默認(rèn)按元素的添加順序設(shè)置元素的索引。集合默認(rèn)按元素的添加順序

53、設(shè)置元素的索引。1. Java 8 改進(jìn)的改進(jìn)的List接口和接口和ListIterator接口接口List作為作為Collection接口的子接口,當(dāng)然可以使用接口的子接口,當(dāng)然可以使用Collection接口里的全部方法。而且由于接口里的全部方法。而且由于List是有序集是有序集合,因此合,因此List集合里增加了一些根據(jù)索引來操作集合元集合里增加了一些根據(jù)索引來操作集合元素的方法。素的方法。p void add(int index, Object element):將元素將元素element插入到插入到List集合的集合的index處。處。p boolean addAll(int ind

54、ex, Collection c):將集合將集合c所包含的所有元素都插入到所包含的所有元素都插入到List集合的集合的index處。處。p Object get(int index):返回集合返回集合index索引處的元素索引處的元素。p int indexOf(Object o):返回對象返回對象o在在List集合中第一集合中第一次出現(xiàn)的位置索引。次出現(xiàn)的位置索引。p int indexOf(Object o):返回對象返回對象o在在List集合中第一集合中第一次出現(xiàn)的位置索引。次出現(xiàn)的位置索引。p int lastIndexOf(Object o):返回對象返回對象o在在List集合中集合

55、中最后一次出現(xiàn)的位置索引。最后一次出現(xiàn)的位置索引。p Object remove(int index):刪除并返回刪除并返回index索引處索引處的元素。的元素。p Object set(int index, Object element):將將index索索引處的元素替換成引處的元素替換成element對象,返回被替換的舊元對象,返回被替換的舊元素。素。p List subList(int fromIndex, int toIndex):返回從索返回從索引引fromIndex(包含包含)到索引到索引toIndex(不包含)處所(不包含)處所有集合元素組成的子集合。有集合元素組成的子集合。除此

56、之外,除此之外,java8還為還為List接口添加了如下兩個(gè)默認(rèn)方接口添加了如下兩個(gè)默認(rèn)方法:法:p void replaceAll(UnaryOperator operator):根據(jù)根據(jù)operator指定的計(jì)算規(guī)則重新設(shè)置指定的計(jì)算規(guī)則重新設(shè)置List集合的所有元集合的所有元素。素。p void sort(Comparator c):根據(jù)根據(jù)Comparator參數(shù)對參數(shù)對List集合的元素排序。集合的元素排序。List的基本用法的基本用法程序試圖返回新字符串對象在程序試圖返回新字符串對象在List集合中的位置,集合中的位置,實(shí)際上實(shí)際上List集合中并未包含該字符串對象。因?yàn)榧现胁⑽?/p>

57、包含該字符串對象。因?yàn)長ist集集合添加對象時(shí)通過合添加對象時(shí)通過new關(guān)鍵字創(chuàng)建的新字符串對象,兩關(guān)鍵字創(chuàng)建的新字符串對象,兩個(gè)對象顯然不是同一對象,但個(gè)對象顯然不是同一對象,但List的的indexOf方法依然方法依然可以飯后可以飯后2。List判斷兩個(gè)對象相等的標(biāo)志是什么呢?判斷兩個(gè)對象相等的標(biāo)志是什么呢?List判斷兩個(gè)對象相等只要通過判斷兩個(gè)對象相等只要通過equals()方法比較方法比較返回返回true即可。即可。實(shí)例實(shí)例equals()方法返回方法返回true,則表明兩個(gè)元素相等,就會(huì)把第一個(gè)元素刪除。,則表明兩個(gè)元素相等,就會(huì)把第一個(gè)元素刪除。注意注意當(dāng)調(diào)用當(dāng)調(diào)用List的的s

58、et(int index, Object element)方法方法來改變來改變List集合指定索引處的元素時(shí),指定的索引必須集合指定索引處的元素時(shí),指定的索引必須是是List集合的有效索引。例如集合長度是集合的有效索引。例如集合長度是4,就不能指,就不能指定替換索引為定替換索引為4的元素的元素-也就是說也就是說,set(int index, Object element)方法不會(huì)改變方法不會(huì)改變List集合的長度。集合的長度。sort()和和replaceAll()List的的listIterator()與與Set只提供了一個(gè)只提供了一個(gè)Iterator()方法不同,方法不同,List還額外還

59、額外提供了一個(gè)提供了一個(gè)ListIterator()方法,該方法返回一個(gè)()方法,該方法返回一個(gè)ListIterator對象,對象,ListIterator接口繼承了接口繼承了Iterator接口接口,提供了專門操作,提供了專門操作List的方法。的方法。ListIterator接口在接口在Iterator接口基礎(chǔ)上增加了如下方法。接口基礎(chǔ)上增加了如下方法。p boolean hasPrevious():返回該迭代器關(guān)聯(lián)的集合返回該迭代器關(guān)聯(lián)的集合是否還有上一個(gè)元素。是否還有上一個(gè)元素。p Object previous(): 返回該迭代器的上一個(gè)元素。返回該迭代器的上一個(gè)元素。p void

60、add(Object o):在指定位置插入一個(gè)元素。在指定位置插入一個(gè)元素。拿拿ListIterator與普通的與普通的Iterator對比,不難發(fā)現(xiàn)對比,不難發(fā)現(xiàn)ListIterator增加了向前迭代的功能(增加了向前迭代的功能(Iterator只能向后只能向后迭代),而且迭代),而且ListIterator還可通過還可通過add()方法向方法向List集集合中添加元素(合中添加元素(Iterator只能刪除元素)。只能刪除元素)。從程序中也可以看出,剛開始也需要正向迭代,即先使用從程序中也可以看出,剛開始也需要正向迭代,即先使用next()方法進(jìn)行迭代,在迭代過程中可以使用方法進(jìn)行迭代,在

溫馨提示

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

評論

0/150

提交評論