CopyOnWriteArraySet源碼解析

原文地址: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))
發佈了58 篇原創文章 · 獲贊 32 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章