ArrayList我们比较熟悉for循环遍历过程中不可用remove,iterator遍历是可以执行删除操作的
val list: MutableList<String> = ArrayList()
list.add("a")
list.add("b")
list.add("c")
for (ss in list) {
list.remove(ss) // ConcurrentModificationException
}
val iterator = list.iterator()
while (iterator.hasNext()) {
var item = iterator.next()
println("remove $item")
iterator.remove() // OK
}
CopyOnWriteArrayList刚好相反
val list: CopyOnWriteArrayList<String> = CopyOnWriteArrayList<String>()
list.add("a")
list.add("b")
list.add("c")
for (ss in list) {
list.remove(ss) // OK
}
val iterator = list.iterator()
while (iterator.hasNext()) {
var item = iterator.next()
// iterator.remove() // CopyOnWriteArrayList java.lang.UnsupportedOperationException
list.remove(iterator.next()) // OK
}
Iterator不支持修改元素的操作
CopyOnWrite 原理
对一个容器进行修改操作(添加、删除、编辑)时候,不会直接对当前容器修改,而是先将当前容器进行 Copy,复制出一个新的容器,然后在这个新的容器里进行增删改元素的操作, 修改完再将原容器的引用指向新的容器,而旧的容器则进行垃圾回收。
另外,CopyOnWriteArrayList线程安全,对元素修改比较耗时。