继续分析源码,上一篇文章把HashMap的分析完毕。本文开始分析HashSet简单的介绍一下。html
HashSet是一个无重复元素集合,内部使用HashMap实现,因此HashMap的特征耶继承了下来。存储的元素是无序的而且HashSet容许使用空的元素。java
HashSet是非同步的。若是多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。(参考JDK1.8文档,关注回复JDK可获取中文版JDK文档)线程
Set s = Collections.synchronizedSet(new HashSet(...));
上文连接:3d
HashMap源码阅读(一)code
先看一下HashMap的继承结构blog
和其余集合同样HashSet也实现了Cloneable和Serializable两个接口,同时也是先了Set接口实现了Set的一些接口规范。继承
HashSet的存储数据是由HashMap来实现的,因此HashMap的一些特性也都继承了过来。在阅读源码的时候千万不要直接的去阅读HashSet在阅读以前最好先把HashMap看了。在阅读HashMap的时候最好结合着1.7版本的源码一块儿看。接口
private transient HashMap<E,Object> map;
上面说到HashSet是由HashMap来实现的而存储的数据做为HashMap的K,V统一就是PRESENTci
// Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object();
无参构造方法,直接建立一个HashMap采用无参构造方法的默认属性上篇文章说过默认容量是16加载因子是0.75
指定容量
指定容量和加载因子,加载因子在HashMap中用来计算容量默认的就是总容量*加载因子,默认的加载因子是0.75
指定集合元素
能够看出HashSet使用put进行添加元素,要添加的元素做为mapd的Key 而value则默认的就是PRESENT。上篇文章介绍过HashMap的put方法若是插入的值的Key不存在则返回null不然就返回已经存在的值,因此这里作了一个判断。是否是很简单。
查找元素调用了HashMap的containsKey方法若是存在返回true不存在返回false。
删除方法也是调用map的remove方法,看到这里咱们看出HashSet所有是依赖于HashMap。
也是经过Map来实现使用keySet来返回一个key的Iterator。
其实HashSet的一些东西都是用HashMap来实现的,若是HashMap的源码已经阅读过的话基本上没有什么问题。(这多是我写的最轻松的一篇问文章哈哈哈哈哈)