HashSet源码学习

文档注释:

说明:hashset的实现基于Hashmap,无序,允许null。

 说明:如果元素合适地分布在桶中,add、remove、contains、size方法的效率稳定。迭代时间与(set中元素个数+map桶个数)成正比,因此初始容量设定不能过大,加载因子不能过小。

说明:线程不安全,多线程访问并且有线程修改set时,必须有额外的同步措施。

说明: 可以在创建时用`Collections.synchronizedSet`封装HashSet来保证线程安全。

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

说明:迭代器的快速失败无法保证, 不能依靠快速失败抛出的异常来保证程序的正确性,快速失败应该只用来检测bug。

代码学习:

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

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

说明:① HashSet的add()、remove()以要插入的元素为key,PRESENT为value。②map的put()、remove()返回的是该key对应的value。

说明:①浅拷贝:原本变化, 副本不变②直接调用父类(Object类)的clone()方法。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值