HashSet源代码剖析

深入解析HashSet的源代码

今天来看看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是不会重复的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值