資源描述:
《ThinkinginJava之Set接口、HashSet源碼學(xué)習(xí).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、ThinkinginJava之Set接口、HashSet源碼學(xué)習(xí) 文章主要討論Set接口的設(shè)計(jì)、以及Set接口的一個(gè)實(shí)現(xiàn)類HashSet的設(shè)計(jì)細(xì)節(jié)。對(duì)于他們的思考,同樣是基于源碼學(xué)習(xí)的?! et接口設(shè)計(jì)通過閱讀API和源碼我們可以知道Java中的Set和數(shù)學(xué)行直觀的“集”的概念是相同的。Set的最大特點(diǎn)也就是不允許在其中放入重復(fù)的元素。Set集合最多只能包含一個(gè)null元素。至于這種特點(diǎn)是如何實(shí)現(xiàn)的,我們先不考究。在其具體子類HashSet里我們?cè)谟懻撝V州java培訓(xùn)咨詢QQ:707552864,544627560 Set接口源碼解
2、析 首先看看Set的源碼吧。 [java]viewplaincopy packagecom.kiritor; /** Set源碼研究*/ importjava.util.Iterator; publicinterfaceSetextendsCollection{ intsize(); booleanisEmpty(); booleancontains(Objecto); Iteratoriterator(); Object[]toArray(); T[]toArray(T[]a); booleanadd(Ee);
3、 booleanremove(Objecto); booleancontainsAll(Collectionc); booleanaddAll(Collectionc); booleanretainAll(Collectionc); booleanremoveAll(Collectionc); voidclear(); booleanequals(Objecto); inthashCode(); } 可以看出的是Set繼承至Collection,而且通過對(duì)比還可以知道的是,Set提供的方法和Colllection指定的方法是
4、完全一樣的。那么它的不重復(fù)是如何體現(xiàn)的呢?這里我們通過研究其具體實(shí)現(xiàn)類HashSet來說明?! ashSet類實(shí)現(xiàn) 同樣的對(duì)于HashSet類的具體源碼筆者就不貼出來了。這里我們只是簡要的對(duì)其的方法做一些分析。首先看看HashSet類的頭部吧?! ?duì)于序列化、Cloneable接口筆者就不細(xì)說了。這里HashSet繼承AbstactSet這個(gè)中間抽象類,并且這個(gè)抽象類又繼承至AbstractCollection。這里簡要的說說自己的理解。在前一章對(duì)ArrayList的學(xué)習(xí)中,筆者并未就這方面給予解釋。AbstractCollection其
5、實(shí)更像是實(shí)現(xiàn)List,Set的共同的方法,而AbstactSetAbstactList更像是提供給Set、List各自特有方法的實(shí)現(xiàn)?! ?、底層實(shí)現(xiàn) 通過其源碼的觀察可以知道的是HashSet的底層實(shí)現(xiàn)是基于HashMap的。它不保證Set的迭代順序而且不保證該順序永久不變。HashSet的實(shí)現(xiàn)較為的簡單,其相關(guān)的操作都是通過直接調(diào)用底層HashMap的相關(guān)方法來完成?! java]viewplaincopy //底層使用HashMap來保存HashSet中所有元素?! rivatetransientHashMapmap; //定
6、義一個(gè)虛擬的Object對(duì)象作為HashMap的value,將此對(duì)象定義為staticfinal?! rivatestaticfinalObjectPRESENT=newObject(); 2、構(gòu)造方法 [java]viewplaincopy *默認(rèn)的無參構(gòu)造器,構(gòu)造一個(gè)空的HashSet?! ?實(shí)際底層會(huì)初始化一個(gè)空的HashMap,并使用默認(rèn)初始容量為16和加載因子0.75?! ?/ publicHashSet(){ map=newHashMap(); } /** *構(gòu)造一個(gè)包含指定collection中的元素的新set
7、?! ? *實(shí)際底層使用默認(rèn)的加載因子0.75和足以包含指定 *collection中所有元素的初始容量來創(chuàng)建一個(gè)HashMap?! ?@paramc其中的元素將存放在此set中的collection?! ?/ publicHashSet(Collectionc){ map=newHashMap(Math.max((int)(c.size()/.75f)+1,16)); addAll(c); } /** *以指定的initialCapacity和loadFactor構(gòu)造一個(gè)空的HashSet。 * *實(shí)際底層以相應(yīng)的參數(shù)構(gòu)
8、造一個(gè)空的HashMap?! ?@paraminitialCapacity初始容量。 *@paramloadFactor加載因子?! ?/ publicHash