注:在看这篇文章之前,如果对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>();

源代码:

    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))

第四章 CopyOnWriteArraySet源码解析的更多相关文章

  1. 第十四章 Executors源码解析

    前边两章介绍了基础线程池ThreadPoolExecutor的使用方式.工作机理.参数详细介绍以及核心源码解析. 具体的介绍请参照: 第十二章 ThreadPoolExecutor使用与工作机理 第十 ...

  2. 第六章 ReentrantLock源码解析2--释放锁unlock()

    最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...

  3. 第九章 LinkedBlockingQueue源码解析

    1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 Node节点内部类与LinkedBlockingQueue的一些属性 static ...

  4. CopyOnWriteArraySet源码解析

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对CopyOnWriteArrayList底层不清楚的话,建议先去看看CopyOn ...

  5. 第零章 dubbo源码解析目录

    第一章 第一个dubbo项目 第二章  dubbo内核之spi源码解析 2.1  jdk-spi的实现原理 2.2 dubbo-spi源码解析 第三章 dubbo内核之ioc源码解析 第四章 dubb ...

  6. 第十三章 ThreadPoolExecutor源码解析

    ThreadPoolExecutor使用方式.工作机理以及参数的详细介绍,请参照<第十二章 ThreadPoolExecutor使用与工作机理 > 1.源代码主要掌握两个部分 线程池的创建 ...

  7. Android进阶:四、RxJava2 源码解析 1

    本文适合使用过Rxjava2或者了解Rxjava2的基本用法的同学阅读 一.Rxjava是什么 Rxjava在GitHub 主页上的自我介绍是 "a library for composin ...

  8. 第二章 ConcurrentHashMap源码解析

    注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http://www.cnblogs.com/java-zhao/p/5106189.html 1.对于 ...

  9. 第三章 CopyOnWriteArrayList源码解析

    注:在看这篇文章之前,如果对ArrayList底层不清楚的话,建议先去看看ArrayList源码解析. http://www.cnblogs.com/java-zhao/p/5102342.html ...

随机推荐

  1. Ionic Js三:下拉刷新

    在加载新数据的时候,我们需要实现下拉刷新效果,代码如下: HTML 代码 <body ng-app="starter" ng-controller="actions ...

  2. 喜大普奔!Django官方文档终于出中文版了

    喜大普奔!Django官方文档终于出中文版了 文章来源:企鹅号 - Crossin的编程教室 昨天经 Sur 同学告知才发现,Django 官方文档居然支持中文了! 之所以让我觉得惊喜与意外,是因为: ...

  3. Tensorflow学习:(三)神经网络优化

    一.完善常用概念和细节 1.神经元模型: 之前的神经元结构都采用线上的权重w直接乘以输入数据x,用数学表达式即,但这样的结构不够完善. 完善的结构需要加上偏置,并加上激励函数.用数学公式表示为:.其中 ...

  4. 字符串hash与字典树

    title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...

  5. 不可不说的Java“锁”事

    前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的 ...

  6. 【8.14校内测试】【DP专题】

    nlogn做法,dp[i]表示当前长度为i的最长上升子序列末尾元素的值. 不会写lower_bound(qwq,贴一个以前的好看点的代码 #include<iostream>//使用low ...

  7. Codeforces Round #361 (Div. 2) A. Mike and Cellphone 水题

    A. Mike and Cellphone 题目连接: http://www.codeforces.com/contest/689/problem/A Description While swimmi ...

  8. hdu 2251 Dungeon Master bfs

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17555   Accepted: 6835 D ...

  9. KVM资源划分分配技巧

    kvm有个叫做超分的概念,根据这个特性可以分配出超出物理机配置的数台虚拟机. 以下是自己总结的一些划分技巧: 一.最保守方法(性能最好) 根据物理机的资源,按虚拟机的数量叠加但不超过物理机的总和.不超 ...

  10. mysql ga rc beta alpha区别

    alpha  暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性 beta 以后的beta版.发布版或产品发布中,所有API.外部可视结构和SQL命令列均不再更改, ...