註:在看這篇文章之前,如果對CopyOnWriteArrayList底層不清楚的話,建議先去看看CopyOnWriteArrayList源碼解析。http://www.cnblogs.com/java-zhao/p/5121944.html1、對於CopyOnWriteArraySet需要掌握以下幾...
註:在看這篇文章之前,如果對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>(); }View Code
註意點:
- CopyOnWriteArraySet底層就是一個CopyOnWriteArrayList
3、添加元素
public boolean add(E e)
使用方法:
strSet.add("hello")
源代碼:
/** * 迴圈遍歷舊數組,若有與e相同的值,return false * 若沒有,向最後插值 */ public boolean add(E e) { return al.addIfAbsent(e); }View Code
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(); } }View Code
註:這一塊兒的源代碼很簡單,只要你看了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); }View Code
5、遍歷所有元素
public Iterator<E> iterator()
使用方法:見上一章《CopyOnWriteArrayList源碼解析》
源代碼:
/** * 調用CopyOnWriteArrayList的iterator() */ public Iterator<E> iterator() { return al.iterator(); }View Code
剩餘的源代碼見上一章《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))