仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 522|回复: 9
打印 上一主题 下一主题

[学习教程] 了解下JAVA的Java汇合进修(十六) HashSet具体先容(源码剖析)和利用示例

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:00:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C#是不行的,比如说美国的航天飞船里就有java开发的程序以上是我的愚见,其实不管那种语言,你学好了,都能找到好的工作,
这一章,我们对HashSet举行进修。
我们先对HashSet有个全体熟悉,然后再进修它的源码,最初再经由过程实例来学会利用HashSet。
第1部分HashSet先容
HashSet简介
HashSet是一个没有反复元素的汇合。
它是由HashMap完成的,不包管元素的按次,并且HashSet同意利用null元素。
HashSet长短同步的。假如多个线程同时会见一个哈希set,而个中最少一个线程修正了该set,那末它必需坚持内部同步。这一般是经由过程对天然封装该set的对象实行同步操纵来完成的。假如不存在如许的对象,则应当利用Collections.synchronizedSet办法来“包装”set。最幸亏创立时完成这一操纵,以避免对该set举行不测的分歧步会见:
Sets=Collections.synchronizedSet(newHashSet(...));
HashSet经由过程iterator()前往的迭代器是fail-fast的。
HashSet的承继干系以下:
  1. java.lang.Object
  2. java.util.AbstractCollection<E>
  3. java.util.AbstractSet<E>
  4. java.util.HashSet<E>
  5. publicclassHashSet<E>
  6. extendsAbstractSet<E>
  7. implementsSet<E>,Cloneable,java.io.Serializable{}
复制代码
HashSet与Map干系以下图:

检察本栏目更多出色内容:http://www.bianceng.cn/Programming/Java/
HashSet的机关函数
  1. //默许机关函数
  2. publicHashSet()
  3. //带汇合的机关函数
  4. publicHashSet(Collection<?extendsE>c)
  5. //指定HashSet初始容量和加载因子的机关函数
  6. publicHashSet(intinitialCapacity,floatloadFactor)
  7. //指定HashSet初始容量的机关函数
  8. publicHashSet(intinitialCapacity)
  9. //指定HashSet初始容量和加载因子的机关函数,dummy没有任何感化
  10. HashSet(intinitialCapacity,floatloadFactor,booleandummy)
复制代码
HashSet的次要API
  1. booleanadd(Eobject)
  2. voidclear()
  3. Objectclone()
  4. booleancontains(Objectobject)
  5. booleanisEmpty()
  6. Iterator<E>iterator()
  7. booleanremove(Objectobject)
  8. intsize()
复制代码
第2部分HashSet源码剖析
为了更懂得HashSet的道理,上面对HashSet源码代码作出剖析。
  1. packagejava.util;
  2. publicclassHashSet<E>
  3. extendsAbstractSet<E>
  4. implementsSet<E>,Cloneable,java.io.Serializable
  5. {
  6. staticfinallongserialVersionUID=-5024744406713321676L;
  7. //HashSet是经由过程map(HashMap对象)保留内容的
  8. privatetransientHashMap<E,Object>map;
  9. //PRESENT是向map中拔出key-value对应的value
  10. //由于HashSet中只必要用到key,而HashMap是key-value键值对;
  11. //以是,向map中增加键值对时,键值对的值流动是PRESENT
  12. privatestaticfinalObjectPRESENT=newObject();
  13. //默许机关函数
  14. publicHashSet(){
  15. //挪用HashMap的默许机关函数,创立map
  16. map=newHashMap<E,Object>();
  17. }
  18. //带汇合的机关函数
  19. publicHashSet(Collection<?extendsE>c){
  20. //创立map。
  21. //为何要挪用Math.max((int)(c.size()/.75f)+1,16),从(c.size()/.75f)+1和16当选择一个对照年夜的树呢?
  22. //起首,申明(c.size()/.75f)+1
  23. //由于从HashMap的效力(工夫本钱和空间本钱)思索,HashMap的加载因子是0.75。
  24. //当HashMap的“阈值”(阈值=HashMap总的巨细*加载因子)<“HashMap实践巨细”时,
  25. //就必要将HashMap的容量翻倍。
  26. //以是,(c.size()/.75f)+1盘算出来的恰好是总的空间巨细。
  27. //接上去,申明为何是16。
  28. //HashMap的总的巨细,必需是2的指数倍。若创立HashMap时,指定的巨细不是2的指数倍;
  29. //HashMap的机关函数中也会从头盘算,找出比“指定巨细”年夜的最小的2的指数倍的数。
  30. //以是,这里指定为16是从功能思索。制止反复盘算。
  31. map=newHashMap<E,Object>(Math.max((int)(c.size()/.75f)+1,16));
  32. //将汇合(c)中的全体元素增加到HashSet中
  33. addAll(c);
  34. }
  35. //指定HashSet初始容量和加载因子的机关函数
  36. publicHashSet(intinitialCapacity,floatloadFactor){
  37. map=newHashMap<E,Object>(initialCapacity,loadFactor);
  38. }
  39. //指定HashSet初始容量的机关函数
  40. publicHashSet(intinitialCapacity){
  41. map=newHashMap<E,Object>(initialCapacity);
  42. }
  43. HashSet(intinitialCapacity,floatloadFactor,booleandummy){
  44. map=newLinkedHashMap<E,Object>(initialCapacity,loadFactor);
  45. }
  46. //前往HashSet的迭代器
  47. publicIterator<E>iterator(){
  48. //实践上前往的是HashMap的“key汇合的迭代器”
  49. returnmap.keySet().iterator();
  50. }
  51. publicintsize(){
  52. returnmap.size();
  53. }
  54. publicbooleanisEmpty(){
  55. returnmap.isEmpty();
  56. }
  57. publicbooleancontains(Objecto){
  58. returnmap.containsKey(o);
  59. }
  60. //将元素(e)增加到HashSet中
  61. publicbooleanadd(Ee){
  62. returnmap.put(e,PRESENT)==null;
  63. }
  64. //删除HashSet中的元素(o)
  65. publicbooleanremove(Objecto){
  66. returnmap.remove(o)==PRESENT;
  67. }
  68. publicvoidclear(){
  69. map.clear();
  70. }
  71. //克隆一个HashSet,并前往Object对象
  72. publicObjectclone(){
  73. try{
  74. HashSet<E>newSet=(HashSet<E>)super.clone();
  75. newSet.map=(HashMap<E,Object>)map.clone();
  76. returnnewSet;
  77. }catch(CloneNotSupportedExceptione){
  78. thrownewInternalError();
  79. }
  80. }
  81. //java.io.Serializable的写进函数
  82. //将HashSet的“总的容量,加载因子,实践容量,一切的元素”都写进到输入流中
  83. privatevoidwriteObject(java.io.ObjectOutputStreams)
  84. throwsjava.io.IOException{
  85. //Writeoutanyhiddenserializationmagic
  86. s.defaultWriteObject();
  87. //WriteoutHashMapcapacityandloadfactor
  88. s.writeInt(map.capacity());
  89. s.writeFloat(map.loadFactor());
  90. //Writeoutsize
  91. s.writeInt(map.size());
  92. //Writeoutallelementsintheproperorder.
  93. for(Iteratori=map.keySet().iterator();i.hasNext();)
  94. s.writeObject(i.next());
  95. }
  96. //java.io.Serializable的读取函数
  97. //将HashSet的“总的容量,加载因子,实践容量,一切的元素”顺次读出
  98. privatevoidreadObject(java.io.ObjectInputStreams)
  99. throwsjava.io.IOException,ClassNotFoundException{
  100. //Readinanyhiddenserializationmagic
  101. s.defaultReadObject();
  102. //ReadinHashMapcapacityandloadfactorandcreatebackingHashMap
  103. intcapacity=s.readInt();
  104. floatloadFactor=s.readFloat();
  105. map=(((HashSet)this)instanceofLinkedHashSet?
  106. newLinkedHashMap<E,Object>(capacity,loadFactor):
  107. newHashMap<E,Object>(capacity,loadFactor));
  108. //Readinsize
  109. intsize=s.readInt();
  110. //Readinallelementsintheproperorder.
  111. for(inti=0;i<size;i++){
  112. Ee=(E)s.readObject();
  113. map.put(e,PRESENT);
  114. }
  115. }
  116. }
复制代码
申明:
<p>
恰恰证明了java的简单,要不怎么没有通过c/c++来搞个这种框架?
沙发
发表于 2015-1-20 12:34:29 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
若天明 该用户已被删除
板凳
发表于 2015-1-24 16:08:35 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
爱飞 该用户已被删除
地板
发表于 2015-1-30 17:37:54 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-6 14:34:18 | 只看该作者
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
小女巫 该用户已被删除
6#
发表于 2015-2-16 13:57:49 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
莫相离 该用户已被删除
7#
发表于 2015-3-5 06:06:09 | 只看该作者
是一种使用者不需花费很多时间学习的语言
第二个灵魂 该用户已被删除
8#
发表于 2015-3-11 23:37:44 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
分手快乐 该用户已被删除
9#
发表于 2015-3-19 16:09:33 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
深爱那片海 该用户已被删除
10#
发表于 2015-3-29 00:53:14 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表