今天来看看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的源代码
1143

被折叠的 条评论
为什么被折叠?



