CopyOnWriteArraySet源码解析

2018-12-20  本文已影响7人  网易数帆

此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

注:在看这篇文章之前,如果对CopyOnWriteArrayList底层不清楚的话,建议先去看看CopyOnWriteArrayList源码解析。

http://www.cnblogs.com/java-zhao/p/5121944.html

1、对于CopyOnWriteArraySet需要掌握以下几点

注:

2、创建

public CopyOnWriteArraySet()

使用方法:

Set<String> strSet = new CopyOnWriteArraySet<String>();

源代码:

    private final CopyOnWriteArrayList<E> al;//底层数据结构

    public CopyOnWriteArraySet() {
        al = new CopyOnWriteArrayList<E>();
    }

注意点:

 

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方法就能看懂

注意点:

 

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源码解析》

 

总结:

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 传统字符型验证安全现状及网易易盾验证码的优势
【推荐】 手把手带你打造一个 Android 热修复框架

上一篇下一篇

猜你喜欢

热点阅读