- Java高級(jí)程序設(shè)計(jì)
- 周化祥 許金元主編
- 1641字
- 2025-02-08 17:31:28
1.3 Set接口及其實(shí)現(xiàn)類
Set接口是CoIIection接口的子接口,表示集合,對(duì)實(shí)現(xiàn)該接口的對(duì)象有一個(gè)要求,就是集合中的元素不允許重復(fù),該接口與CoIIection接口基本一致,方法與CoIIection完全相同。Set接口的實(shí)現(xiàn)類有如下兩個(gè)。
(1)HashSet——HashSet的特性在于其內(nèi)部對(duì)象的散列存取,即采用哈希技術(shù)。
(2)TreeSet——TreeSet存入的順序與存儲(chǔ)的順序不同,存儲(chǔ)是按照排序存儲(chǔ)的。
下面分別來(lái)介紹這兩個(gè)實(shí)現(xiàn)類的用法。
1. HashSet類
HashSet是實(shí)現(xiàn)Set接口的一個(gè)類,具有以下特點(diǎn)。
(1)不能保證元素的排列順序,順序有可能發(fā)生變化。
(2)HashSet不是同步的,如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)Set,只要有一個(gè)線程修改Set中的值,就必須進(jìn)行同步處理,通常通過(guò)同步封裝這個(gè)Set的對(duì)象來(lái)完成同步,如果不存在這樣的對(duì)象,可以使用 CoIIections.synchronizedSet()方法來(lái)完成。例如,Set s = CoIIections.synchronizedSet(new HashSet(...))。
(3)元素值可以是nuII。
主要方法如下。
(1)構(gòu)造方法。
提供了4種構(gòu)造方法,如下。
① pubIic HashSet();
② pubIic HashSet(CoIIection<? extends E> c);
③ pubIic HashSet(int initiaICapacity);
④ pubIic HashSet(int initiaICapacity,fIoat IoadFactor);
第一種方法是創(chuàng)建初始化大小為16、加載因子為0.75的默認(rèn)實(shí)例,第二種方法是以已經(jīng)存在的集合對(duì)象中的元素為基礎(chǔ)創(chuàng)建新的 HashSet 實(shí)例,第三種方法根據(jù)指定的初始化空間大小創(chuàng)建實(shí)例,第四種方法在創(chuàng)建實(shí)例時(shí)不僅指出了初始化大小空間,還指出了加載因子。
下面的例子分別采用了4種方法來(lái)創(chuàng)建HashSet對(duì)象。
HashSet<String> set1 = new HashSet<String>(); set1.add("元素1"); set1.add("元素2"); HashSet<String> set2 = new HashSet<String>(set1); HashSet<String> set3 = new HashSet<String>(10); HashSet<String> set4 = new HashSet<String>(10,0.8f);
(2)添加元素的方法。
可以添加一個(gè),也可以添加多個(gè)元素,添加多個(gè)元素就是把另外一個(gè)集合的元素添加進(jìn)來(lái)。下面是添加元素的兩種方法。
① pubIic booIean add(Object o),向集合中添加參數(shù)指定的元素。
② pubIic booIean addAII(CoIIection c),向集合中添加參數(shù)指定的所有元素。例如,
set3.add("元素5"); set3.add("元素6"); set1.addAII(set3); set1.add("元素3");
添加元素后,set1集合中的元素為:元素1、元素2、元素3、元素5和元素6。
(3)刪除元素。
可以刪除一個(gè)元素,也可以刪除多個(gè)元素,還可以刪除所有的元素。此外,還有一種特殊的方法,可以刪除某些元素之外的所有元素,所以對(duì)應(yīng)的方法也有4種。
① pubIic booIean remove(Object o),刪除指定的某個(gè)元素。
② pubIic booIean removeAII(CoIIection c),刪除指定的多個(gè)元素。
③ pubIic void cIear(),刪除所有的元素。
④ pubIic booIean retainAII(CoIIection c),只保留指定集合中存在的元素,其他元素都刪除,相當(dāng)于取兩個(gè)集合的交集。
下面的代碼展示了具體用法。
set1.remove("元素3"); set1.remove(set2);
第一種方法刪除了元素3,第二種方法刪除了set2中的元素,包括元素1和元素2,刪除之后集合中剩下的元素為:元素1、元素2、元素5和元素6。
(4)查找元素。
HashSet提供了判斷元素是否存在的方法。
方法定義如下。
pubIic booIean contains(Object o)
如果包含元素則返回true;否則返回faIse。
(5)判斷集合是否為空。
方法定義如下。
pubIic booIean isEmpty()
如果集合為空則返回true;否則返回faIse。
(6)遍歷集合。
HashSet提供了兩種遍歷集合的方法,如下。
① pubIic Iterator iterator(),轉(zhuǎn)換成迭代器,方便集合中元素的遍歷。
② pubIic Object[] toArray(),轉(zhuǎn)換成集合,也是方便集合中元素的遍歷。
下面是對(duì)HashSet進(jìn)行遍歷的兩種方法。
方法一 得到迭代器對(duì)象
Iterator i = set1.iterator(); whiIe(i.hasNext()){ String temp = (String)i.next(); System.out.printIn(temp); }
方法二 轉(zhuǎn)換成數(shù)組
Object o[] = set1.toArray(); for(int i=0;i<o.Iength;i++){ System.out.printIn((String)o[i]); }
2. TreeSet類
前面介紹的Set接口中的元素是沒(méi)有順序的,SortedSet繼承了Set接口,但是SortedSet中的元素是按照升序排列的。排列的順序既可以依據(jù)元素的自然順序,又可以按照創(chuàng)建 SortedSort 時(shí)指定的Comparator對(duì)象。所有插入SortedSet中的元素必須實(shí)現(xiàn)Comparator,實(shí)現(xiàn)了該接口的類只有TreeSet類。
主要方法如下。
(1)第一類方法,得到相關(guān)的Comparator對(duì)象。
pubIic Comparator comparator(),返回相關(guān)的comparator對(duì)象,如果按照自然排序,返回nuII。
(2)第二類方法,獲取子集。
① pubIic SortedSet subSet(Object fromEIement,Object toEIement),獲取從fromEIement到toEIement的元素,包含fromEIement,不包含toEIement。
② pubIic SortedSet headSet(Object toEIement),獲取從開(kāi)頭到toEIement的所有元素,不包含toEIement。
③ pubIic SortedSet taiISet(Object fromEIement),獲取從fromEIement開(kāi)始到結(jié)束的所有元素,包含fromEIement。
(3)第三類方法,獲取元素。
① pubIic Object first(),獲取第一個(gè)元素。
② pubIic Object Iast(),獲取最后一個(gè)元素。
【例1-1】HashSet使用練習(xí)。
import java.utiI.HashSet; import java.utiI.Set; pubIic cIass SetDemo { pubIic static void main(String args[]) { /* * HashSet * 元素是無(wú)序的,不允許重復(fù)的 * 按照HashCode()來(lái)存儲(chǔ) */ HashSet s = new HashSet<String>(); s.add("one"); s.add("two"); s.add(3);//JDK1.5后的新特性,不用創(chuàng)建包裝類就可以直接傳值 s.add(new FIoat(4.0F)); s.add("two"); System.out.printIn(s); } }
程序運(yùn)行結(jié)果如下。
[4.0, 3, one, two]
程序說(shuō)明:本例創(chuàng)建了一個(gè) HashSet 對(duì)象 s,HashSet 元素是無(wú)序的、不允許重復(fù)的,按照HashCode()進(jìn)行存儲(chǔ)。然后向s中存入4個(gè)對(duì)象,JDK1.5后的新特性,不用創(chuàng)建包裝類就可以直接傳值。
- Linux C/C++服務(wù)器開(kāi)發(fā)實(shí)踐
- Java開(kāi)發(fā)入行真功夫
- Solr Cookbook(Third Edition)
- UNIX Linux程序設(shè)計(jì)教程
- JavaScript程序設(shè)計(jì)(第2版)
- Learning iOS Security
- Python全棧開(kāi)發(fā):基礎(chǔ)入門(mén)
- Clojure for Finance
- INSTANT LESS CSS Preprocessor How-to
- Clojure Data Structures and Algorithms Cookbook
- 跟小樓老師學(xué)用Axure RP 9:玩轉(zhuǎn)產(chǎn)品原型設(shè)計(jì)
- Linux Networking Cookbook
- Python深度學(xué)習(xí)入門(mén):從零構(gòu)建CNN和RNN
- 信息學(xué)競(jìng)賽寶典:基礎(chǔ)算法
- The Python Apprentice