




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1. 項(xiàng)目愿景實(shí)現(xiàn)和完善一個(gè)處理集合數(shù)據(jù)結(jié)構(gòu)的基本類(lèi)庫(kù)。2. 用戶(hù)問(wèn)題程序員在開(kāi)發(fā)程序時(shí)往往在表示集合的數(shù)據(jù)結(jié)構(gòu)上花費(fèi)好多時(shí)間,而且自己開(kāi)發(fā)的集合結(jié)構(gòu)不規(guī)范,功能不全面,有一套現(xiàn)成的處理集合的數(shù)據(jù)結(jié)構(gòu)能大大提高開(kāi)發(fā)速度和軟件質(zhì)量。3. 簡(jiǎn)單分析通用的集合數(shù)據(jù)結(jié)構(gòu)有下列幾種: (1)set保證成員唯一 , 支持?jǐn)?shù)學(xué)中的集合操作,如交、并; (2)list支持成員順序,提供按索引訪問(wèn)成員; (3)Map成員為鍵值對(duì),提供按鍵對(duì)象查找值對(duì)象; (4)bag保留成員個(gè)數(shù),能查詢(xún)成員的數(shù)量; (5)queue- 支持先進(jìn)先出,能擴(kuò)展為按優(yōu)先級(jí)操作;
2、60;(6)stack- 支持后進(jìn)先出。4. 使用界面 Jdk1.4 集合框架主體結(jié)構(gòu)圖顯示了 J2sdk 集合框架類(lèi)結(jié)構(gòu)。J2sdk 集合由 collection 接口牽頭,Set、List 和 Map 承擔(dān)主角,用數(shù)據(jù)結(jié)構(gòu) Tree,Array,Hash,Link 作為具體實(shí)現(xiàn)手段,組成了一個(gè)在功能和性能上相當(dāng)不錯(cuò)的框架。整個(gè)框架由主體結(jié)構(gòu)和輔助結(jié)構(gòu)組成,主體結(jié)構(gòu)形成了框架基礎(chǔ),輔助結(jié)構(gòu)為使用框架提供了便利。 我們用下表來(lái)描述 j2sdk 的集合框架的主體結(jié)構(gòu):接口簡(jiǎn)述實(shí)現(xiàn)操作特性成員要求Set成員不能重復(fù)HashSet外部無(wú)序地遍歷成員。成員可為任意 Object 子類(lèi)的對(duì)象,
3、但如果覆蓋了 equals 方法,同時(shí)注意修改 hashCode 方法。TreeSet外部有序地遍歷成員; 附加實(shí)現(xiàn)了 SortedSet, 支持子集等要求順序的操作成員要求實(shí)現(xiàn) caparable 接口,或者使用 Comparator 構(gòu)造TreeSet。成員一般為同一類(lèi)型。LinkedHashSet外部按成員的插入順序遍歷成員成員與 HashSet 成員類(lèi)似List提供基于索引的對(duì)成員的隨機(jī)訪問(wèn)ArrayList提供快速的基于索引的成員訪問(wèn),對(duì)尾部成員的增加和刪除支持較好成員可為任意 Object 子類(lèi)的對(duì)象LinkedList對(duì)列表中任何位置的成員的增加和刪除支持較好,但對(duì)基于
4、索引的成員訪問(wèn)支持性能較差成員可為任意 Object 子類(lèi)的對(duì)象Map保存鍵值對(duì)成員,基于鍵找值操作,compareTo 或 compare 方法對(duì)鍵排序HashMap能滿(mǎn)足用戶(hù)對(duì) Map 的通用需求鍵成員可為任意 Object 子類(lèi)的對(duì)象,但如果覆蓋了 equals 方法,同時(shí)注意修改 hashCode 方法。TreeMap支持對(duì)鍵有序地遍歷,使用時(shí)建議先用 HashMap 增加和刪除成員,最后從 HashMap 生成 TreeMap; 附加實(shí)現(xiàn)了 SortedMap 接口,支持子 Map 等要求順序的操作鍵成員要求實(shí)現(xiàn) caparable 接口,或者使用 Comparator 構(gòu)造 Tre
5、eMap。鍵成員一般為同一類(lèi)型。LinkedHashMap保留鍵的插入順序,用 equals 方法檢查鍵和值的相等性成員可為任意 Object 子類(lèi)的對(duì)象,但如果覆蓋了 equals 方法,同時(shí)注意修改 hashCode 方法。IdentityHashMap使用 = 來(lái)檢查鍵和值的相等性。成員使用的是嚴(yán)格相等WeakHashMap其行為依賴(lài)于垃圾回收線程,沒(méi)有絕對(duì)理由則少用 在 J2sdk 集合框架中,除了具體實(shí)現(xiàn)集合的接口和類(lèi)外,還有一些操作和輔助類(lèi),包括一個(gè) fa?ade 類(lèi),兩個(gè)等值方法和兩個(gè)比較接口。· facade 類(lèi) Collections 類(lèi)Collec
6、tions 類(lèi)包含了對(duì)框架中集合的普遍性操作 , 充當(dāng) fa?ade。這些操作都被實(shí)現(xiàn)為靜態(tài)函數(shù),分為幾下幾類(lèi):1. 最大最小函數(shù),對(duì)于某個(gè)集合,尋找最大最小成員(或鍵成員),要求成員都必須實(shí)現(xiàn) comparable 接口;2. 生成不可更改的 singleton 集合(singleton 集合為包含一個(gè)成員的集合);3. 對(duì) list 進(jìn)行排序、重組、倒序操作;4. 對(duì) list 進(jìn)行填充、批量置換、和快速搜索操作;5. 對(duì)集合進(jìn)行同步化,以便適應(yīng)多線程環(huán)境;6. 對(duì)集合進(jìn)行不可更改修飾,返回不可更改的集合視圖。· 等值方法一 equals(Object o) 方法equals 方
7、法實(shí)現(xiàn)了一個(gè)等價(jià)關(guān)系:1. 自反性 : 對(duì)于任何對(duì)象 x, x.equals(x) 必須返回 true;2. 對(duì)稱(chēng)性 : 對(duì)于任何對(duì)象 x 和 y, x.equals(y)=true 當(dāng)切僅當(dāng) y.equals(x)=true;3. 傳遞性 : 對(duì)于任何對(duì)象 x,y,z,如果 x.equals(y)=true 和 y.equals(z)=true, 則 x.equals(z)=true;4. 一致性 : 對(duì)于任何對(duì)象 x 和 y,只要沒(méi)有對(duì) x,y 進(jìn)行修改,多次的 x.equals(y) 調(diào)用應(yīng)該返回相同的值;5. 對(duì)于任何 non-null 對(duì)象 x, x.equals(null)=fal
8、se。Object 類(lèi)中這個(gè)方法被實(shí)現(xiàn)為嚴(yán)格相等,也就是如果比較的兩個(gè)對(duì)象是同一對(duì)象,即 = 操作為 true,則返回 true。所以如果想在集合中搜索內(nèi)容相等的成員對(duì)象或在 map 中獲取內(nèi)容相等的鍵映射的值,成員對(duì)象(或鍵對(duì)象)的類(lèi)必須覆蓋 equals(Object o) 方法。o 等值方法二 hashCode() 方法這個(gè)方法返回一個(gè)對(duì)象的 hash 代碼,在 hashtable 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的集合中,它決定了這個(gè)對(duì)象被放到哪個(gè) bucket 中。而 equals 方法則是進(jìn)一步到 bucket 尋找具體對(duì)象的依據(jù)。為了 hashtable 數(shù)據(jù)結(jié)構(gòu)能正常工作,hashCode 方法的
9、通用協(xié)議是:equals 方法定為相等的兩個(gè)對(duì)象的 hashCode()返回的整數(shù)一定相同。只有這樣才能在 hashtable 數(shù)據(jù)結(jié)構(gòu)中找到這個(gè)對(duì)象。而 equals 方法定為不相等的兩個(gè)對(duì)象的 hashCode()返回的整數(shù)可以不相同,如果相同則為哈西沖突。所以盡量保證 equals 方法定為不相等的對(duì)象的 hashCode()返回的整數(shù)不相同。類(lèi) Object 實(shí)現(xiàn)的 hashCode 使用對(duì)象的內(nèi)部地址轉(zhuǎn)化為整數(shù)返回,使得 o1.equals(o2) 當(dāng)且僅當(dāng) o1.hashCode()= o2.hashCode()。o 比較接口一接口 Comparable這個(gè)接口要求全序,也叫自然排
10、序,實(shí)現(xiàn)了這個(gè)接口的類(lèi)的 compareTo 稱(chēng)為自然比較方法。Collections.sort 方法能對(duì)一個(gè)實(shí)現(xiàn)了這個(gè)接口的類(lèi)的對(duì)象的列表自動(dòng)排序。在沒(méi)有指定 comparator 的情況下,這樣的對(duì)象同時(shí)也能作為排序 map 的鍵或排序 set 的成員。如果一個(gè)類(lèi)的任意兩個(gè)實(shí)例 e1 和 e2,(pareTo(Object)e2) = 0) 和 e1.equals(Object)e2) 有同樣的邏輯值,我們就說(shuō)這個(gè)類(lèi)的自然排序和 equals 方法一致。另外 pareTo(null) 應(yīng)該拋出 NullPointerException。強(qiáng)烈要求保持這種一致性,否則沒(méi)有顯示指定 compar
11、ator 的排序 set(或 map)將會(huì)破壞 set ( 或 map) 的普遍接口協(xié)議,因?yàn)檫@些接口協(xié)議用 equals 方法決定成員身份。compareTo 方法的協(xié)議為:1. 當(dāng) e1 < e2 時(shí) (pareTo(Object)e2) <0;2. 當(dāng) e1 > e2 時(shí) (pareTo(Object)e2) 0;3. 當(dāng) e1.equals(e2) 時(shí) (pareTo(Object)e2) =04. 當(dāng)兩個(gè)對(duì)象無(wú)法比較時(shí),應(yīng)該拋出 ClassCastException 異常。在 j2sdk1.4 中,下面的類(lèi)實(shí)現(xiàn)了這個(gè)接口:BigDecimal, BigInteger
12、, Byte, ByteBuffer, Character, CharBuffer, Charset, CollationKey, Date, Double, DoubleBuffer, File, Float, FloatBuffer, IntBuffer, Integer, Long, LongBuffer, ObjectStreamField, Short, ShortBuffer, String, URI。0. 比較接口二接口 Comparator這個(gè)接口對(duì)一個(gè)集合的對(duì)象作全序排序,實(shí)現(xiàn)了這個(gè)接口的類(lèi)的對(duì)象能在 Collections.sort 方法、TreeSet 和 TreeMap
13、 等數(shù)據(jù)結(jié)構(gòu)中控制排序結(jié)果。對(duì)于一個(gè)集合中的成員來(lái)說(shuō),一個(gè) Comparator 對(duì)象和 equals 一致,當(dāng)且只當(dāng)這個(gè)對(duì)象的方法 compare 對(duì)于任意兩個(gè)成員 e1 和 e2, (compare(Object)e1, (Object)e2)=0) 和 e1.equals(Object)e2) 有同樣的邏輯值。和 Comparable 接口一樣,強(qiáng)烈要求保持這種一致性。Compare 方法的協(xié)議為:1. 當(dāng) e1 < e2 時(shí) compare(Object)e1, (Object)e2)<0;2. 當(dāng) e1 > e2 時(shí) compare(Object)e1, (Obje
14、ct)e2) 0;3. 當(dāng) e1.equals(e2) 時(shí) compare(Object)e1, (Object)e2)=04. 當(dāng)兩個(gè)對(duì)象無(wú)法比較時(shí),應(yīng)該拋出 ClassCastException 異常。在 j2sdk1.4 中,下面的類(lèi)實(shí)現(xiàn)了這個(gè)接口: Collator4.2. 通用集合介紹通用集合開(kāi)源項(xiàng)目 commons-collection 是對(duì) j2sdk 集合框架的擴(kuò)展和完善,實(shí)現(xiàn)了普遍的編程需求。bag 是 commons-collection 對(duì) j2sdk 集合框架的一個(gè)擴(kuò)展。與 j2sdk 集合框架中 set 集合不同的是,bag 允許成員重復(fù),所以就增加了一些額
15、外的操作。bag 的成員應(yīng)是同一數(shù)據(jù)類(lèi)型,它為每個(gè)成員登記數(shù)量,使用對(duì)象的 hashCode 判斷相等性。 假如有一個(gè)包含 a, a, b, c 的 bag 集合,調(diào)用 getCount(a) 將返回 2,調(diào)用 uniqueSet 將得到 a, b, c。下圖是 bag 的類(lèi)層次圖: 比起 jsdk 集合框架中 set 來(lái),bag 目前缺少 LinkedHashBag 實(shí)現(xiàn),其它類(lèi)特性相似。1. 復(fù)制現(xiàn)成的集合;2. 在復(fù)制品上執(zhí)行修改操作;3. 用復(fù)制品覆蓋現(xiàn)成的集合。CursorableLinkedList 對(duì) List 接口的雙鏈實(shí)現(xiàn),實(shí)現(xiàn)了 List 接口的所有可選操作,包括
16、 LinkedList 中的 stack/queue/dequeue 操作和支持 ListIterator, 允許對(duì) List 的并發(fā)修改。CursorableSubList 是個(gè)內(nèi)部類(lèi)。 通用集合之 Map 圖顯示了 commons-collection 對(duì) jsdk 集合框架的擴(kuò)展 , 真可以說(shuō)是龐大陣容。 首先是 HashMap 和 TreeMap 的 fast 版,關(guān)于 fast 版的特性可以參見(jiàn)前面的 FastArrayList 的說(shuō)明。BeanMap 是個(gè)很有意思的 Map, 它利用 java Bean 的屬性反射功能,把一個(gè) Java Bean 變成一個(gè) Ma
17、p 來(lái)操作,例如一個(gè)具有 name 屬性的 Bean 構(gòu)造的 BeanMap,可以使用 beanMap.get("name") 得到 bean 的 name 屬性值。ReferenceMap 是一個(gè)基于 Hashtablede 的 Map 實(shí)現(xiàn),允許垃圾回收線程回收鍵值映射。在創(chuàng)建 ReferenceMap 對(duì)象時(shí)可以指定鍵或值的引用種類(lèi)(hard,soft 或者 weak), 當(dāng)用非 hard 引用創(chuàng)建集合后,當(dāng)鍵或值不可到達(dá)時(shí)垃圾回收線程可能回收這些鍵或值對(duì)象。當(dāng)鍵的引用種類(lèi)為"weak", 值的引用種類(lèi)為"hard"時(shí),Refe
18、renceMap 的行為類(lèi)似 j2sdk 集合框架中的 WeakHashMap. ReferenceMap 缺省構(gòu)造其采用"hard"引用的鍵和"soft"引用的值。SoftRefHashMap 被缺省構(gòu)造的 ReferenceMap 取代。MultiHashMap 實(shí)現(xiàn)了 MultiMap 接口。 MultiMap 與普通 Map 意義上稍微有區(qū)別,它提供的鍵值映射中值為一個(gè)集合。比如執(zhí)行 put( key, new Integer(1) ) 后執(zhí)行 Object get( key ) 將得到一個(gè)整數(shù)的集合。 也就是說(shuō),這個(gè)類(lèi)不會(huì)覆蓋先前的同一鍵所對(duì)應(yīng)
19、的值對(duì)象,而是把新值對(duì)象加到鍵所對(duì)應(yīng)的值對(duì)象集合中。DoubleOrderedMap 是一個(gè) Map 接口的紅 - 黑樹(shù)實(shí)現(xiàn)。這個(gè)類(lèi)保證鍵對(duì)象和值對(duì)象的雙排序。這個(gè)類(lèi)對(duì)于需要通過(guò)鍵對(duì)象或值對(duì)象查找鍵 - 值對(duì)的程序非常有效,而普通的 Map 實(shí)現(xiàn)只能通過(guò)鍵對(duì)象查鍵 - 值對(duì)。雖然同樣的目的能用一對(duì) TreeMaps 實(shí)現(xiàn)(containsKey 方法由鍵值 TreeMaps 實(shí)現(xiàn),containsValue 方法由另一個(gè)值鍵 TreeMaps 實(shí)現(xiàn)),它在兩個(gè) TreeMaps 的數(shù)據(jù)同步上很容易出現(xiàn)問(wèn)題,而且冗余數(shù)據(jù)比較大。紅 - 黑樹(shù)實(shí)現(xiàn)的 DoubleOrderedMap 則很容易地同步
20、數(shù)據(jù),而且使得冗余最小。這個(gè)類(lèi)對(duì)數(shù)據(jù)成員有些限制:如果一個(gè)值或鍵已經(jīng)存在于 DoubleOrderedMap 對(duì)象中,再試圖保存這個(gè)值或鍵會(huì)拋出 IllegalArgumentException 異常。這個(gè)類(lèi)的方法返回的 Map.Entry 實(shí)例不允許調(diào)用 setValue() 方法。為了順利操作 DoubleOrderedMap 對(duì)象,這個(gè)類(lèi)新增加的方法如下 :1. Object getKeyForValue(Object value) 是普通 Map 的 get 方法的對(duì)立面,它從值找鍵 。2. Object removeValue(Object value) 尋找和刪除指定的值對(duì)象,并返
21、回這個(gè)值對(duì)象對(duì)應(yīng)的鍵對(duì)象,同時(shí)這個(gè)鍵對(duì)象在 DoubleOrderedMap 對(duì)象不存在了。3. Set entrySetByValue() 返回一個(gè)值對(duì)象排序的 Map.Entry 集合。4. Set keySetByValue() 返回一個(gè)鍵對(duì)象排序的 Map.Entry 集合。5. Collection valuesByValue() 返回一個(gè)值對(duì)象排序的值對(duì)象集合。ProxyMap 是一個(gè) 對(duì) map 實(shí)現(xiàn)的 wrapper, 它的 Map 方法都直接調(diào)用了被 wrap 的 Map. 這個(gè)類(lèi)一般用作擴(kuò)展現(xiàn)存 Map 實(shí)現(xiàn)的擴(kuò)展框架,這些擴(kuò)展通過(guò)繼承的方法不太方便。SequencedHa
22、shMap 是一個(gè)按照鍵值對(duì)插入順序序列化的 Map 實(shí)現(xiàn),它具有類(lèi)似于 List 的操作接口,除了具有 getFirst,getLast 方法訪問(wèn)頭尾成員之外 , 甚至還可以基于索引隨機(jī)訪問(wèn)鍵和值對(duì)象。 這點(diǎn)是 j2sdk 集合框架中的 LinkedHashMap 沒(méi)有的特性。LRUMap 是 SequencedHashMap 的子類(lèi),具有最大尺寸。集合中的成員數(shù)達(dá)到最大尺寸時(shí),采用最近最少使用算法排除成員。所有的對(duì)某個(gè)鍵對(duì)象(不管是 get 還是 put)的操作都會(huì)使其移到前端。我們要介紹的最后一個(gè) Map 是 StaticBucketMap。這個(gè)類(lèi)實(shí)現(xiàn)了一個(gè)多線程環(huán)境下使用的 hashm
23、ap, 但是這個(gè)類(lèi)的桶數(shù)在構(gòu)造函數(shù)中指定,而且后來(lái)也不會(huì)變化。對(duì)于每個(gè)桶都有獨(dú)立的并發(fā)訪問(wèn)監(jiān)視器 (monitor), 所以多個(gè)線程可以同時(shí)訪問(wèn)不同的桶。這個(gè)類(lèi)本身就是線程安全的,不需要 Collections.synchronizedMap(Map) 方法得到同步版。使用這個(gè)類(lèi)時(shí)要注意的是多線程環(huán)境下批量操作結(jié)果的不確定性。 通用集合之 buffer 圖顯示了 commons-collections 對(duì) j2sdk 集合框架擴(kuò)展的另一個(gè)概念實(shí)現(xiàn)buffer 集合。ArrayStack 是擴(kuò)展了 ArrayList 而實(shí)現(xiàn)的棧 API,在單線程下操作比較合適。 一個(gè) ArraySta
24、ck 對(duì)象中成員的刪除順序基于其插入順序:最近插入的最先刪除,而其 iterator 則是按插入序訪問(wèn)成員。BoundedFifoBuffer 類(lèi)的對(duì)象代表一個(gè)具有固定大小的緩沖,成員的刪除順序和他們的插入順序一致,即"先進(jìn)先出"。可以通過(guò)下列函數(shù)獲得同步版的 BoundedFifoBuffer 類(lèi)對(duì)象: Buffer fifo = BufferUtils.synchronizedBuffer(new BoundedFifoBuffer();UnboundedFifoBuffer 是和 BoundedFifoBuffer 類(lèi)相同功能,但是緩沖尺寸可以在運(yùn)行時(shí)擴(kuò)充。同樣可以通
25、過(guò) BufferUtils 獲得其對(duì)象的同步對(duì)象:Buffer fifo = BufferUtils.synchronizedBuffer(new UnboundedFifo();BinaryHeap 是一個(gè)對(duì) PriorityQueue 和 Buffer 的二叉堆實(shí)現(xiàn)。刪除操作 刪除的是堆頂?shù)某蓡T(最小成員或最大成員),而 iterator 的成員訪問(wèn)順序不定??梢酝ㄟ^(guò) BufferUtils 獲得其對(duì)象的同步對(duì)象: Buffer heap = BufferUtils.synchronizedBuffer(new BinaryHeap();SynchronizedPriorityQueue
26、是一個(gè)線程安全的 PriorityQueue 類(lèi)的包裝,方法都是對(duì)被包裝類(lèi)的方法的多線程安全裝飾。4.3. 應(yīng)用編程接口下圖展示了各種集合的應(yīng)用編程接口,另外的接口還有各種 iterator、utils 類(lèi)和具體實(shí)現(xiàn)的類(lèi)的擴(kuò)充接口,請(qǐng)參見(jiàn)相關(guān)文檔。 了解集合編程接口的最好方法是看文檔,特別是仔細(xì)看看這些接口函數(shù)對(duì)集合的影響和返回值。4.4. 例子為了演示集合的使用,我們先準(zhǔn)備兩個(gè)成員對(duì)象類(lèi)和一個(gè) Comparator 實(shí)現(xiàn)。下表描述了兩個(gè)成員對(duì)象類(lèi)對(duì)集合框架中輔助結(jié)構(gòu)的實(shí)現(xiàn)情況(注意 equals 方法和 hashCode 方法必須符合上面輔助結(jié)構(gòu)一節(jié)描述的關(guān)系):類(lèi)名equals
27、方法和 hashCode 方法MyBean沒(méi)覆蓋MyBean_Comparable覆蓋MyBeanComparator實(shí)現(xiàn)兩個(gè)對(duì)象的排序算法,用于 Tree 結(jié)構(gòu)實(shí)現(xiàn)的集合MyBean 代碼如下: public class MyBean private String name; public MyBean(String name) = name; public MyBean() super(); public String getName() return name; public void setName(String string) name = string; MyB
28、ean_Comparable 代碼如下: public class MyBean_Comparable implements Comparable private String name; public MyBean_Comparable() super(); public MyBean_Comparable(String name) = name; public String getName() return name; public void setName(String string) name = string; public int hashCode() retu
29、rn name.hashCode(); public boolean equals(Object arg0) try MyBean_Comparable pt1 = (MyBean_Comparable) arg0; return getName().equals(pt1.getName() ; catch (ClassCastException e) return false; public int compareTo(Object arg0) try MyBean_Comparable pt1 = (MyBean_Comparable) arg0; return getName().com
30、pareTo(pt1.getName() ; catch (ClassCastException e) return 0; MyBeanComparator 類(lèi)實(shí)現(xiàn)了 Comparator 接口: public class MyBeanComparator implements Comparator public int compare(Object e1,Object e2) try MyBean pt1 = (MyBean) e1; MyBean pt2 = (MyBean) e2; return pt1.getName().compareTo(pt2.getName() ; catch
31、(ClassCastException e) return 0; 例子代碼主要體現(xiàn)了框架中集合的主要特性,內(nèi)容如下: import java.util.Collection; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import mons.collections.Bag; import mons.collections.FastArrayList; import mons.
32、collections.HashBag; import mons.collections.TreeBag; public class CollectionTest public static void main(String args) / 實(shí)驗(yàn)一 System.out.println("測(cè)試 bag 的特性"); testCount(); / 實(shí)驗(yàn)二 System.out.println("測(cè)試 comparator 接口"); testComparator(); / 實(shí)驗(yàn)三 System.out.println("測(cè)試成員的引用性"
33、;); testReference (); / 實(shí)驗(yàn)四 System.out.println("不可改變的集合的含義"); testUnmodified(); / 實(shí)驗(yàn)五 System.out.println("測(cè)試 fastarraylist 的特性"); testFastList(); / 實(shí)驗(yàn)六 System.out.println("IdentityHashMap 的嚴(yán)格相等性"); testIdentityHashMap(); /* * 主要顯示: * 1、Hash 結(jié)構(gòu)實(shí)現(xiàn)的集合可以包含任意成員; * 2、Bag 保留成員
34、的數(shù)目; */ private static void testCount() Bag baghash = new HashBag(); baghash.add(new MyBean("MyBean"); baghash.add(new MyBean("MyBean"); baghash.add(new MyBean_Comparable("MyBean_Comparable1"); baghash.add(new MyBean_Comparable("MyBean_Comparable1"); baghash.a
35、dd(new MyBean_Comparable("MyBean_Comparable2"); System.out.println("testCount(HashBag) = " + baghash); /* * 主要顯示 Comparator 得編寫(xiě)和 treebag 得順序特性 * */ private static void testComparator() int i = 0; Bag bagtree = new TreeBag(new MyBeanComparator(); bagtree.add( new MyBean("seco
36、nd"); bagtree.add( new MyBean("first"); bagtree.add( new MyBean("first"); Iterator iterator = bagtree.iterator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); System.out.println("testComparator(TreeBag) = " + element); iterator = bagtree.ite
37、rator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); element.setName("name" + i+); System.out.println("testComparator(TreeBag) = " + element.getName(); iterator = bagtree.iterator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); Sys
38、tem.out.println("testComparator(TreeBag) = " + element); System.out.println("testComparator(TreeBag) = " + element.getName(); System.out.println("testComparator(TreeBag) = " + bagtree); /* * 主要顯示集合保留引用的特性 * */ private static void testReference () Bag bagtree = new TreeB
39、ag(new MyBeanComparator(); MyBean myBean = new MyBean("before"); bagtree.add(myBean); System.out.println("testReference(bagtree) = " + bagtree); Iterator iterator = bagtree.iterator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); System.out.println("t
40、estReference(bagtree) = " + element.getName(); element.setName("after"); iterator = bagtree.iterator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); System.out.println("testReference(bagtree) = " + element.getName(); System.out.println("testRefer
41、ence(bagtree) = " + bagtree); /* * 主要顯示不可改變的集合的含義 * */ private static void testUnmodified() Bag baghash = new HashBag(); baghash.add(new MyBean("first"); baghash.add(new MyBean("first"); int i = 0; Collection c = java.util.Collections.unmodifiableCollection(baghash); try c.a
42、dd(new MyBean("third"); catch(UnsupportedOperationException e) System.out.println("testUnmodified: yes it cannot be modified!"); Iterator iterator = c.iterator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); System.out.println("testUnmodified(before)
43、= " + element.getName(); element.setName("forth" + i+); iterator = c.iterator(); while (iterator.hasNext() MyBean element = (MyBean) iterator.next(); System.out.println("testUnmodified(after) = " + element.getName(); /* * 測(cè)試 fastarraylist 的特性 */ private static void testFastL
44、ist() arraylist(1000); fastlist_slow(1000); fastlist_fast(1000); private static void arraylist(int accounts) List list = new ArrayList(); long start; long end; start = System.currentTimeMillis(); for(int i =0;i<accounts;i+) list.add(new MyBean(""+i); for(int i =0;i<accounts;i+) list.
45、get(i); for(int i =0;i<2;i+) list.remove(list.size()-1); end = System.currentTimeMillis(); System.out.println("arraylist:" + (start-end); private static void fastlist_slow(int accounts) List list = new FastArrayList(); long start; long end; start = System.currentTimeMillis(); for(int i
46、=0;i<accounts;i+) list.add(new MyBean(""+i); for(int i =0;i<accounts;i+) list.get(i); for(int i =0;i<2;i+) list.remove(list.size()-1); end = System.currentTimeMillis(); System.out.println("fastlist_slow:" + (start-end); private static void fastlist_fast(int accounts) Lis
47、t list = new FastArrayList(); long start; long end; start = System.currentTimeMillis(); for(int i =0;i<accounts;i+) list.add(new MyBean(""+i); (FastArrayList)list).setFast(true); for(int i =0;i<accounts;i+) list.get(i); for(int i =0;i<2;i+) list.remove(list.size()-1); end = System
48、.currentTimeMillis(); System.out.println("fastlist_fast:" + (start-end); /* * 主要顯示 IdentityHashMap 的嚴(yán)格相等性 * */ private static void testIdentityHashMap() Map map1 = new IdentityHashMap(); String key = new String("first"); String key2 = new String("first"); map1.put(key,
49、new MyBean("first"); System.out.println("IdentityHashMap:"+map1.containsKey(key); System.out.println("IdentityHashMap:"+map1.containsKey(key2); Map map2 = new HashMap(); map2.put(key, new MyBean("first"); System.out.println("HashMap"+map2.containsKey(key); System.out.println("HashMap"+map2.con
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育機(jī)構(gòu)師資管理的法律責(zé)任及合規(guī)要求
- 教育心理學(xué)-指導(dǎo)教師提升教學(xué)效果的鑰匙
- 2025年中國(guó)N-甲基乙酰胺數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 智能科技背景下的教育心理學(xué)發(fā)展趨勢(shì)
- 探究教育政策變革與教育水平提升的關(guān)聯(lián)性
- 抖音商戶(hù)主播話術(shù)標(biāo)準(zhǔn)執(zhí)行制度
- 抖音商戶(hù)市場(chǎng)專(zhuān)員流量渠道拓展制度
- 山東醫(yī)學(xué)高等專(zhuān)科學(xué)?!度肆Y源管理綜合實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 長(zhǎng)沙幼兒師范高等專(zhuān)科學(xué)?!度毡靖艣r》2023-2024學(xué)年第一學(xué)期期末試卷
- 西安歐亞學(xué)院《中國(guó)文學(xué)經(jīng)典鑒賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 國(guó)際海域劃界測(cè)量技術(shù)方法
- 市政設(shè)施維護(hù)服務(wù)項(xiàng)目方案
- 橫紋肌溶解癥課件
- GB/T 23312.1-2009漆包鋁圓繞組線第1部分:一般規(guī)定
- 交通運(yùn)輸行業(yè)建設(shè)工程生產(chǎn)安全事故統(tǒng)計(jì)調(diào)查制度
- SAP聯(lián)產(chǎn)品生產(chǎn)訂單結(jié)算過(guò)程x
- 2021年呼倫貝爾農(nóng)墾集團(tuán)有限公司校園招聘筆試試題及答案解析
- 宮外孕右輸卵管妊娠腹腔鏡下盆腔粘連分解術(shù)、右輸卵管妊娠開(kāi)窗取胚術(shù)手術(shù)記錄模板
- 教科版 科學(xué)小學(xué)二年級(jí)下冊(cè)期末測(cè)試卷及參考答案(基礎(chǔ)題)
- 混凝土重力壩設(shè)計(jì)說(shuō)明書(shū)
- 弱電設(shè)備維護(hù)保養(yǎng)方案
評(píng)論
0/150
提交評(píng)論