美文网首页
JDK源码 -- CopyOnWriteArraySet

JDK源码 -- CopyOnWriteArraySet

作者: TomyZhang | 来源:发表于2019-08-15 15:06 被阅读0次

一、概念

类定义:

public class CopyOnWriteArraySet<E> extends AbstractSet<E>
        implements java.io.Serializable 
  • 继承了AbstractSet类,实现了Set接口,拥有一组Set通用的操作。
  • 实现了Serializable接口,可进行序列化。

特点:

  • 允许空元素。
  • 无重复元素。
  • 线程安全。

二、使用

//TestCopyOnWriteArraySet
public class TestCopyOnWriteArraySet {
    private static final String TAG = "CopyOnWriteArraySet";
    private CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet();

    public void testAdd() {
        set.add(null);
        set.add("AAA");
        set.add("BBB");
        set.add("CCC");
        set.add("CCC");
        Log.d(TAG, "zwm, add set: " + set);
    }

    public void testRemove() {
        set.remove("AAA");
        Log.d(TAG, "zwm, remove set: " + set);
    }

    public void testContains() {
        Log.d(TAG, "zwm, contains BBB: " + set.contains("BBB"));
    }

    public void testIterator() {
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            Log.d(TAG, "zwm, iterator item: " + iterator.next());
        }
    }

    public void testSize() {
        Log.d(TAG, "zwm, size: " + set.size());
    }
}

//测试代码
private void testMethod() {
    Log.d(TAG, "zwm, testMethod");
    TestCopyOnWriteArraySet testCopyOnWriteArraySet = new TestCopyOnWriteArraySet();
    testCopyOnWriteArraySet.testAdd();
    testCopyOnWriteArraySet.testContains();
    testCopyOnWriteArraySet.testRemove();
    testCopyOnWriteArraySet.testSize();
    testCopyOnWriteArraySet.testIterator();
}

//输出log
2019-08-17 14:31:41.940 zwm, testMethod
2019-08-17 14:31:41.941 zwm, add set: [null, AAA, BBB, CCC]
2019-08-17 14:31:41.941 zwm, contains BBB: true
2019-08-17 14:31:41.942 zwm, remove set: [null, BBB, CCC]
2019-08-17 14:31:41.942 zwm, size: 3
2019-08-17 14:31:41.942 zwm, iterator item: null
2019-08-17 14:31:41.942 zwm, iterator item: BBB
2019-08-17 14:31:41.942 zwm, iterator item: CCC

三、原理

重要参数

//实例对数据进行操作的是CopyOnWriteArrayList
private final CopyOnWriteArrayList<E> al;

构造函数

//无参构造函数,创建CopyOnWriteArrayList对象用于实际操作数据
public CopyOnWriteArraySet() {
    al = new CopyOnWriteArrayList<E>();
}

//指定Collection对象作为参数的构造函数,创建CopyOnWriteArrayList对象并插入Collection中的非重复元素
public CopyOnWriteArraySet(Collection<? extends E> c) {
    if (c.getClass() == CopyOnWriteArraySet.class) {
        @SuppressWarnings("unchecked") CopyOnWriteArraySet<E> cc =
            (CopyOnWriteArraySet<E>)c;
        al = new CopyOnWriteArrayList<E>(cc.al);
    }
    else {
        al = new CopyOnWriteArrayList<E>();
        al.addAllAbsent(c);
    }
}

public boolean add(E e)

//插入一个元素
public boolean add(E e) {
    return al.addIfAbsent(e); //调用CopyOnWriteArrayList的addIfAbsent方法
}

public boolean remove(Object o)

//删除与对象o相等的元素
public boolean remove(Object o) {
    return al.remove(o); //调用CopyOnWriteArrayList的remove方法
}

public boolean contains(Object o)

//判断是否包含与对象o相等的对象
public boolean contains(Object o) {
    return al.contains(o); //调用CopyOnWriteArrayList的contains方法
}

public Iterator<E> iterator()

//获取迭代器对象
public Iterator<E> iterator() {
    return al.iterator(); //调用CopyOnWriteArrayList的iterator方法
}

public int size()

//获取元素个数
public int size() {
    return al.size(); //调用CopyOnWriteArrayList的size方法
}

四、主题

CopyOnWriteArrayList

相关文章

网友评论

      本文标题:JDK源码 -- CopyOnWriteArraySet

      本文链接:https://www.haomeiwen.com/subject/yvyzjctx.html