CopyOnWriteArrayList和ArrayList是Java中常用的List实现类,它们在实现和使用上有一些区别。
1. 线程安全性:
- ArrayList是非线程安全的,多个线程同时修改ArrayList可能会导致数据不一致或抛出ConcurrentModificationException异常。
- CopyOnWriteArrayList是线程安全的,多个线程可以同时对CopyOnWriteArrayList进行读操作,而写操作会进行复制,写操作之间是互斥的,保证了数据的一致性。
2. 内部实现:
- ArrayList使用可调整大小的数组实现,每次添加或删除元素时需要复制底层数组。如果频繁进行添加和删除操作,性能会受到影响。
- CopyOnWriteArrayList使用数组实现,但在写操作时会创建一个新的数组,并将旧数组的元素复制到新数组中。这样保证了读操作的线程安全性,但写操作的性能较低。
3. 迭代器:
- ArrayList的迭代器在迭代过程中,如果发现集合被修改了,会抛出ConcurrentModificationException异常。
- CopyOnWriteArrayList的迭代器可以安全地进行遍历,因为它遍历的是一个快照版本的数组,不会抛出ConcurrentModificationException异常。
适用场景:
- ArrayList适用于单线程环境或多线程环境下读操作远远多于写操作的场景,因为它的性能较高。
- CopyOnWriteArrayList适用于多线程环境下对集合进行频繁的读操作,而写操作相对较少的场景,例如读多写少的缓存场景。
示例代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class ArrayListVsCopyOnWriteArrayList {
public static void main(String[] args) {
// ArrayList示例
List arrayList = new ArrayList();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
// 在迭代过程中使用ArrayList进行写操作会抛出ConcurrentModificationException异常
Iterator iterator1 = arrayList.iterator();
while (iterator1.hasNext()) {
String element = iterator1.next();
arrayList.remove(element);
}
// CopyOnWriteArrayList示例
List copyOnWriteArrayList = new CopyOnWriteArrayList();
copyOnWriteArrayList.add("A");
copyOnWriteArrayList.add("B");
copyOnWriteArrayList.add("C");
// 在迭代过程中使用CopyOnWriteArrayList进行写操作不会抛出异常
Iterator iterator2 = copyOnWriteArrayList.iterator();
while (iterator2.hasNext()) {
String element = iterator2.next();
copyOnWriteArrayList.remove(element);
}
}
}
输出:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:969)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:919)
at ArrayListVsCopyOnWriteArrayList.main(ArrayListVsCopyOnWriteArrayList.java:17)
说明:在ArrayList的示例中,迭代器在遍历过程中尝试删除元素,导致抛出ConcurrentModificationException异常。而在CopyOnWriteArrayList的示例中,迭代器可以安全地遍历并删除元素。
领取专属 10元无门槛券
私享最新 技术干货