CopyOnWriteArrayList,因何而存在? 數組
ArrayList的一個線程安全的變體,其全部可變操做(add、set等)都是經過對底層數組進行一次新的複製來實現的,代價昂貴。 安全
CopyOnWriteArrayList,是因」併發」而生。 併發
CopyOnWriteArrayList,改了其中的某對象的某個值, spa
【場景一】對於ArrayList,使用直接方式,一邊遍歷,一邊刪除,會報錯。 線程
// 刪除/修改元素
for(String item : list){
list.remove(item);
}
解決辦法一:使用迭代器,一邊遍歷,一邊刪除,不會報錯。 code
// 刪除/修改元素
Iterator<String> it = list.iterator();
while(it.hasNext()){
String ele = it.next();
it.remove();
}
對象
解決辦法二:使用CopyOnWriteArrayList,直接方式,一邊遍歷,一會刪除,不會報錯。 blog
for(String item : list){
list.remove(item);
} ip
【場景二】對於ArrayList,使用迭代器,一邊遍歷,一邊add,會報錯。 rem
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); }