JDKソース--CopyOnWriteArraySet

3679 ワード

一、概念
クラス定義:
public class CopyOnWriteArraySet extends AbstractSet
        implements java.io.Serializable 
  • AbstractSetクラスを継承し、Setインタフェースを実現し、Set共通の操作のセットを持つ.
  • はSerializableインタフェースを実現し、シーケンス化することができる.
  • 特徴:
  • は空の要素を許可します.
  • 重複要素はありません.
  • スレッドは安全です.
  • 二、使用
    //TestCopyOnWriteArraySet
    public class TestCopyOnWriteArraySet {
        private static final String TAG = "CopyOnWriteArraySet";
        private CopyOnWriteArraySet 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 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 al;
    
    コンストラクタ
    //      ,  CopyOnWriteArrayList          
    public CopyOnWriteArraySet() {
        al = new CopyOnWriteArrayList();
    }
    
    //  Collection           ,  CopyOnWriteArrayList     Collection       
    public CopyOnWriteArraySet(Collection extends E> c) {
        if (c.getClass() == CopyOnWriteArraySet.class) {
            @SuppressWarnings("unchecked") CopyOnWriteArraySet cc =
                (CopyOnWriteArraySet)c;
            al = new CopyOnWriteArrayList(cc.al);
        }
        else {
            al = new CopyOnWriteArrayList();
            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 iterator()
    //       
    public Iterator iterator() {
        return al.iterator(); //  CopyOnWriteArrayList iterator  
    }
    
    public int size()
    //      
    public int size() {
        return al.size(); //  CopyOnWriteArrayList size  
    }
    
    四、テーマ
    CopyOnWriteArrayList