欢迎来到天天文库
浏览记录
ID:50830755
大小:43.95 KB
页数:4页
时间:2020-03-15
《ThinkinginJava之Set接口、HashSet源码学习.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、ThinkinginJava之Set接口、HashSet源码学习 文章主要讨论Set接口的设计、以及Set接口的一个实现类HashSet的设计细节。对于他们的思考,同样是基于源码学习的。 Set接口设计通过阅读API和源码我们可以知道Java中的Set和数学行直观的“集”的概念是相同的。Set的最大特点也就是不允许在其中放入重复的元素。Set集合最多只能包含一个null元素。至于这种特点是如何实现的,我们先不考究。在其具体子类HashSet里我们在讨论之。广州java培训咨询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,而且通过对比还可以知道的是,Set提供的方法和Colllection指定的方法是
4、完全一样的。那么它的不重复是如何体现的呢?这里我们通过研究其具体实现类HashSet来说明。 HashSet类实现 同样的对于HashSet类的具体源码笔者就不贴出来了。这里我们只是简要的对其的方法做一些分析。首先看看HashSet类的头部吧。 对于序列化、Cloneable接口笔者就不细说了。这里HashSet继承AbstactSet这个中间抽象类,并且这个抽象类又继承至AbstractCollection。这里简要的说说自己的理解。在前一章对ArrayList的学习中,笔者并未就这方面给予解释。AbstractCollection其
5、实更像是实现List,Set的共同的方法,而AbstactSetAbstactList更像是提供给Set、List各自特有方法的实现。 1、底层实现 通过其源码的观察可以知道的是HashSet的底层实现是基于HashMap的。它不保证Set的迭代顺序而且不保证该顺序永久不变。HashSet的实现较为的简单,其相关的操作都是通过直接调用底层HashMap的相关方法来完成。 [java]viewplaincopy //底层使用HashMap来保存HashSet中所有元素。 privatetransientHashMapmap; //定
6、义一个虚拟的Object对象作为HashMap的value,将此对象定义为staticfinal。 privatestaticfinalObjectPRESENT=newObject(); 2、构造方法 [java]viewplaincopy *默认的无参构造器,构造一个空的HashSet。 *实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。 */ publicHashSet(){ map=newHashMap(); } /** *构造一个包含指定collection中的元素的新set
7、。 * *实际底层使用默认的加载因子0.75和足以包含指定 *collection中所有元素的初始容量来创建一个HashMap。 *@paramc其中的元素将存放在此set中的collection。 */ publicHashSet(Collectionc){ map=newHashMap(Math.max((int)(c.size()/.75f)+1,16)); addAll(c); } /** *以指定的initialCapacity和loadFactor构造一个空的HashSet。 * *实际底层以相应的参数构
8、造一个空的HashMap。 *@paraminitialCapacity初始容量。 *@paramloadFactor加载因子。 */ publicHash
此文档下载收益归作者所有