HashSet源代码剖析
2013-12-19 10:13
190 查看
今天来看看HashSet的源代码。
从图片可以看到HashSet是AbstractSet的子类。实现了Set,Cloneable和Serializable接口。说明HashSet是可以序列话和可以克隆的。
看到这两个成员变量其实你就已经明白了HashSet为什么叫HashSet,和猜到HashSet中的方法的实现。
HashSet底层维护着一个HashMap对象。在new出HashSet的时候,将这个map对象初始化。HashSet的构造方法跟HashMap也差不多,也是有四个。其实底层也是调用HashMap的构造方法。下面的代码可以充分说这一点。
包括里面的add方法,clear方法,remove方法其实都是调用HashMap的put方法,clear方法和remove方法。
可能会有个疑问。HashMap是key-value对,HashSet只有value。底层代码怎么通用啊!!其实很简单。上面第二章图片中有private static final Object PRESENT = new Object();这段代码,当你调用HashSet.add(value);方法时,其实是调用HashSet.map.put(value,PRESENT );把你add的值当做底层维护的map对象的key,PRESENT 当做是map的value,放到map中。所以HashSet的add方法add的值是不会重复的,因为是调用HashMap.put(key,
value)方法,而HashMap.put方法的key是不会重复的。
从图片可以看到HashSet是AbstractSet的子类。实现了Set,Cloneable和Serializable接口。说明HashSet是可以序列话和可以克隆的。
看到这两个成员变量其实你就已经明白了HashSet为什么叫HashSet,和猜到HashSet中的方法的实现。
HashSet底层维护着一个HashMap对象。在new出HashSet的时候,将这个map对象初始化。HashSet的构造方法跟HashMap也差不多,也是有四个。其实底层也是调用HashMap的构造方法。下面的代码可以充分说这一点。
包括里面的add方法,clear方法,remove方法其实都是调用HashMap的put方法,clear方法和remove方法。
可能会有个疑问。HashMap是key-value对,HashSet只有value。底层代码怎么通用啊!!其实很简单。上面第二章图片中有private static final Object PRESENT = new Object();这段代码,当你调用HashSet.add(value);方法时,其实是调用HashSet.map.put(value,PRESENT );把你add的值当做底层维护的map对象的key,PRESENT 当做是map的value,放到map中。所以HashSet的add方法add的值是不会重复的,因为是调用HashMap.put(key,
value)方法,而HashMap.put方法的key是不会重复的。
相关文章推荐
- php中关于mysqli和mysql区别的一些知识点分析
- C++练习题,持续更新。
- Java默认遵守的命名规则
- AB程序核心代码(MFC从文件读取一行+MFC字符串处理+C在文件末尾追加内容)
- struts2访问方法
- C++常见错误中英文对照表
- __asm__ volatile 之 C语言嵌入式汇编
- 构造代码快、this的应用、static关键字、main函数
- ASP.NET MVC 模型绑定的 6 个建议
- ASP.NET 应用程序生命周期概述[转自MSDN]
- (翻译)从底层了解ASP.NET体系结构 [转]
- php的扩展和嵌入--c扩展开发demo! print "helloworld"
- des加密解密JAVA与.NET互通实例
- Java 读取TXT一行多列数据
- SAP Penetration Testing Using Metasploit Final
- (beego)beego例子WebIM
- Java中的重载、覆盖和隐藏
- c/c++创建Windows服务
- NetBeans文件被锁,无法修改
- java中获取TXT文件编码格式