#|HashSet源码学习

文档注释: #|HashSet源码学习
文章图片

说明:hashset的实现基于Hashmap,无序,允许null。
#|HashSet源码学习
文章图片
说明:如果元素合适地分布在桶中,add、remove、contains、size方法的效率稳定。迭代时间与(set中元素个数+map桶个数)成正比,因此初始容量设定不能过大,加载因子不能过小。
【#|HashSet源码学习】#|HashSet源码学习
文章图片

说明:线程不安全,多线程访问并且有线程修改set时,必须有额外的同步措施。
#|HashSet源码学习
文章图片

说明: 可以在创建时用`Collections.synchronizedSet`封装HashSet来保证线程安全。
#|HashSet源码学习
文章图片

说明:迭代器实现了快速失败:在迭代器创建后,以非(迭代器自己的remove方法)修改set会抛出`ConcurrentModificationException`异常,这样可以避免未知风险。
#|HashSet源码学习
文章图片

说明:迭代器的快速失败无法保证, 不能依靠快速失败抛出的异常来保证程序的正确性,快速失败应该只用来检测bug。
代码学习: #|HashSet源码学习
文章图片

说明: HashSet实现了`Serializable`接口,即这个类的所有属性和方法都会自动序列化。map被`transient`修饰,该变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。PRESENT用来填充map中的value。
#|HashSet源码学习
文章图片

说明:HashSet构造函数:(1)无参构造,实例化一个Hashmap,沿用HashMap中的初始容量及加载因子。(2)有参构造:传入参数为集合c,这里涉及到泛型通配符上界:泛型参数必须是E类型或它的子类。实例化的map加载因子为0.75,容量为max(能放下集合c的大小,16)。addAll()方法来自`AbstactCollection`抽象类,返回boolean类型,foreach循环add集合c中的元素。
#|HashSet源码学习
文章图片

说明:① HashSet的add()、remove()以要插入的元素为key,PRESENT为value。②map的put()、remove()返回的是该key对应的value。
#|HashSet源码学习
文章图片

说明:①浅拷贝:原本变化, 副本不变②直接调用父类(Object类)的clone()方法。
#|HashSet源码学习
文章图片

说明:序列化和反序列化,调用`ObjectOutStream`和`ObjectInputStream`中的方法

    推荐阅读