CopyOnWriteArraySet源码解析
来源:互联网 发布:万界淘宝商txt 编辑:程序博客网 时间:2024/05/29 11:58
原文地址:http://www.cnblogs.com/java-zhao/p/5122447.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>();
源代码:
private final CopyOnWriteArrayList<E> al;//底层数据结构 public CopyOnWriteArraySet() { al = new CopyOnWriteArrayList<E>(); }
注意点:
- CopyOnWriteArraySet底层就是一个CopyOnWriteArrayList
3、添加元素
public boolean add(E e)
使用方法:
strSet.add("hello")
源代码:
/** * 循环遍历旧数组,若有与e相同的值,return false * 若没有,向最后插值 */ public boolean add(E e) { return al.addIfAbsent(e); }
CopyOnWriteArrayList的addIfAbsent(E e)
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")
源代码:
/** * 调用CopyOnWriteArrayList的remove(Object o)方法 */ public boolean remove(Object o) { return al.remove(o); }
5、遍历所有元素
public Iterator<E> iterator()
使用方法:见上一章《CopyOnWriteArrayList源码解析》
源代码:
/** * 调用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))
阅读全文
0 0
- CopyOnWriteArraySet源码解析
- 【JDK】:CopyOnWriteArrayList、CopyOnWriteArraySet 源码解析
- Java并发编程与技术内幕:CopyOnWriteArrayList、CopyOnWriteArraySet源码解析
- 《Java源码分析》:CopyOnWriteArrayList/ CopyOnWriteArraySet
- 《Java源码分析》:CopyOnWriteArrayList/ CopyOnWriteArraySet
- CopyOnWriteArraySet
- CopyOnWriteArraySet
- CopyOnWriteArraySet
- JUC源码分析24-队列-CopyOnWriteArrayList,CopyOnWriteArraySet
- CopyOnWriteArrayList与CopyOnWriteArraySet源码简析
- JAVA 并发类(五) CopyOnWriteArraySet 源码分析
- CopyOnWriteArrayList&CopyOnWriteArraySet
- CopyOnWriteArraySet简介
- juc--CopyOnWriteArraySet
- Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet
- Java多线程 -- JUC包源码分析2 -- Copy On Write/CopyOnWriteArrayList/CopyOnWriteArraySet
- 使用 CopyOnWriteArrayList 和 CopyOnWriteArraySet
- java.util.concurrent.CopyOnWriteArraySet
- IntelliJ IDEA入门
- Spring-Boot初学之配置文件application.properties(thymeleaf模板)
- OpenDaylight 铍版本开发环境搭建流程
- ctrl+shift+t,怎么看某个class属于哪个工程的那个jar包里?
- xshell连接不上虚拟机的ip
- CopyOnWriteArraySet源码解析
- HashMap底层实现原理
- 如何动态开辟二维数组
- cocos2dx opengl入门系列五-显示多纹理
- 配置torch、nccl环境遇到的问题
- python3.6+pyqt5 IDE: Pycahrm+Qtdesign 快速开发GUI程序学习资源
- 大型JavaScript应用程序架构模式
- Java成员变量、局部变量、静态变量、成员方法、全局方法等概念的区别
- dwr3.0推送框架的入门搭建及解答(最新)