HashSet源代码剖析

来源:互联网 发布:闲鱼的淘宝介入有用吗 编辑:程序博客网 时间:2024/06/05 16:41

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

0 0