文档注释:
文章图片
说明:hashset的实现基于Hashmap,无序,允许null。
文章图片
说明:如果元素合适地分布在桶中,add、remove、contains、size方法的效率稳定。迭代时间与(set中元素个数+map桶个数)成正比,因此初始容量设定不能过大,加载因子不能过小。
【#|HashSet源码学习】
文章图片
说明:线程不安全,多线程访问并且有线程修改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`中的方法
推荐阅读
- Java|Java Junit注解 @Test @Before @After @BeforeClass @AfterClass 学习以及实践总结
- 算法刷题打卡|算法学习 第三十天 有序数组构造二叉搜索树
- java|Java基于Socket实现简单QQ聊天详细教程
- rabbitmq从入门到精通|RabbitMQ入门 -- 阿里云服务器安装RabbitMQ
- JUC并发编程|JUC并发编程—— volatile 关键字详解
- java|Java中volatile关键字详解
- java学习|JUC并发编程汇总彻底搞懂JUC
- python-海洋数据处理|python 基于metpy计算位涡平流项(水平)
- Quartz学习笔记(一) 初遇篇