CopyOnWriteArrayList,因何而存在?
ArrayList的一個線程安全的變體,其所有可變操作(add、set 等)都是通過對底層數組進行一次新的復制來實現的,代價昂貴。
CopyOnWriteArrayList,是因”並發”而生。
CopyOnWriteArrayList,改了其中的某對象的某個值,
【場景一】對於ArrayList,使用直接方式,一邊遍歷,一邊刪除,會報錯。
// 刪除/修改元素
for(String item : list){
list.remove(item);}
解決辦法一:使用迭代器,一邊遍歷,一邊刪除,不會報錯。
// 刪除/修改元素
Iterator<String> it = list.iterator();
while(it.hasNext()){
String ele = it.next();
it.remove();
}
http://blog.sina.com.cn/s/blog_605f5b4f0100qsgf.html
解決辦法二:使用CopyOnWriteArrayList,直接方式,一邊遍歷,一會刪除,不會報錯。
for(String item : list){
list.remove(item);
}
【場景二】對於ArrayList,使用迭代器,一邊遍歷,一邊add,會報錯。
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
String tem = str + "...";
list.add(tem);
}
解決辦法一:改用CopyOnWriteArrayList,直接方式,一邊遍歷,一邊add,不會報錯。
for(String item : list){
String tem = item + "...";
list.add(tem);
}
解決辦法二:改用CopyOnWriteArrayList,一邊遍歷,一邊add,不會報錯。
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
String tem = str + "...";
list.add(tem);
}
【場景三】對於CopyOnWriteArrayList,迭代器,不能remove。
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
String tem = str + "...";
it.remove();
}
解決辦法一:使用直接方式,一邊遍歷,一邊add/remove()
for(String item : list){
String tem = item + "...";
list.remove(item);
list.add(tem);
}
【總結】底層究竟發生着什么?CPU、內存使用如何? to be continued…