第四章 CopyOnWriteArraySet源码解析
源码 解析 第四章
2023-09-27 14:22:34 时间
注:在看这篇文章之前,如果对CopyOnWriteArrayList底层不清楚的话,建议先去看看CopyOnWriteArrayList源码解析。
http://www.cnblogs.com/java-zhao/p/5121944.html
1、对于CopyOnWriteArraySet需要掌握以下几点
- 创建:CopyOnWriteArraySet()
- 添加元素:即add(E)方法
- 删除对象:即remove(E)方法
- 遍历所有对象:即iterator(),在实际中更常用的是增强型的for循环去做遍历
注:
- CopyOnWriteArraySet(不可添加重复元素)底层是CopyOnWriteArrayList(可添加重复元素)。
- Set集合没有按索引直接获取或修改或添加或删除的方法(eg.get(int index),add(int index,E e),set(int index,E e),remove(int index))
2、创建
public CopyOnWriteArraySet()
使用方法:
Set<String> strSet = new CopyOnWriteArraySet<String>();
源代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private final CopyOnWriteArrayList<E> al;//底层数据结构 public CopyOnWriteArraySet() { al = new CopyOnWriteArrayList<E>(); }
注意点:
- CopyOnWriteArraySet底层就是一个CopyOnWriteArrayList
3、添加元素
public boolean add(E e)
使用方法:
strSet.add("hello")
源代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 循环遍历旧数组,若有与e相同的值,return false * 若没有,向最后插值 */ public boolean add(E e) { return al.addIfAbsent(e); }
CopyOnWriteArrayList的addIfAbsent(E e)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public boolean addIfAbsent(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = new Object[len + 1]; for (int i = 0; i < len; ++i) { if (eq(e, elements[i]))//先循环一遍看看有没有与要插入的值相同的值 return false; // 如果有,直接返回 else newElements[i] = elements[i]; } newElements[len] = e;//如果没有,就赋值 setArray(newElements); return true; } finally { lock.unlock(); } }
注:这一块儿的源代码很简单,只要你看了CopyOnWriteArrayList源码解析中的add方法就能看懂
注意点:
- CopyOnWriteArraySet每次add都要遍历数组,性能要低于CopyOnWriteArrayList
4、删除元素
public boolean remove(Object o)
使用方法:
strSet.remove("hello")
源代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 调用CopyOnWriteArrayList的remove(Object o)方法 */ public boolean remove(Object o) { return al.remove(o); }
5、遍历所有元素
public Iterator<E> iterator()
使用方法:见上一章《CopyOnWriteArrayList源码解析》
源代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 调用CopyOnWriteArrayList的iterator() */ public Iterator<E> iterator() { return al.iterator(); }
剩余的源代码见上一章《CopyOnWriteArrayList源码解析》
总结:
- CopyOnWriteArraySet底层就是一个CopyOnWriteArrayList
- CopyOnWriteArraySet在add元素的时候要遍历一遍数组,从而起到不添加重复元素的作用,但是由于要遍历数组,效率也会低于CopyOnWriteArrayList的add
- Set集合没有按索引直接获取或修改或添加或删除的方法(eg.get(int index),add(int index,E e),set(int index,E e),remove(int index))
相关文章
- 人脸识别5.3- insightface人脸3d关键点检测源码更改,根据姿态角修正图片角度,调整向量解析值,增大识别准确度,以及返回俯仰角,偏航角,旋转角
- ajax 底层源码解析
- COST231_hata模型信道仿真matlab编程源码
- 深入理解Spark:核心思想与源码分析. 3.3 创建metadataCleaner
- storm-kafka-0.8-plus 源码解析
- 耗时 16 小时,阿里 P7 把 Spring 源码解析整套笔记透彻剖析
- Spring源码解析(?)Spring使用构造函数实例分析
- Spring源码解析(十四)Spring调用初始化方法initializeBean
- 【kafka源码】TopicCommand之alter源码解析(分区扩容)
- 《Android 源码设计模式解析与实战》——第1章,第1.3节构建扩展性更好的系统——里氏替换原则
- 《Android 源码设计模式解析与实战》——第2章,第2.3节单例模式的使用场景
- ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)
- Android View体系(八)从源码解析View的layout和draw流程
- Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码
- SwiftUI 手势大全之可用的手势类型有哪些(教程含源码)
- Picasso源码的简单解析(一)
- RxSwift源码与模式分析一:基本类
- 多目标遗传算法 ------ NSGA-II (部分源码解析) 实数、二进制编码的变异操作 mutation.c
- 物联网平台搭建的全过程介绍(五)——基于阿里云物联网平台的Android聊天app源码
- 单片机超声波测距模块原理与源码解析
- Dubbo源码之服务端的发布
- spring源码分析之<context:property-placeholder/>和<property-override/>
- SPRING多个占位符配置文件解析源码研究--转
- 源码分析shiro认证授权流程
- spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
- .Net Core 3.0授权组件源码解析
- .Net Core 3.0 认证组件源码解析
- 曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的