Both ArrayList and CopyOnWriteArrayList are the implementation of the List interface in Java. But there are certain differences as well.
The following are the important differences between ArrayList and CopyOnWriteArrayList.
| Sr. No. | Key | ArrayList | CopyOnWriteArrayList |
|---|---|---|---|
| 1 | Synchronization | ArrayList is not synchronized in nature. | CopyOnWriteArrayList on other hand is synchronized in nature i.e at a time only one thread can access the object. |
| 2 | Performance | ArrayList is fast as no synchronization in its operation. | Synchronization makes CopyOnWriteArrayList slow in performance. |
| 3 | Fail safety | ArrayList iterators are failed fast and throw ConcurrentModificationException on modification during the traverse. | CopyOnWriteArrayList are fail-safe and allow modification during the traverse. |
| 4 | Remove element | An iterator of ArrayList can perform remove operation while iteration. | CopyOnWriteArrayList cant performs remove operation while iteration, otherwise it will throw run-time exception UnsupportedOperationException. |
| 5 | Introduction in Java | ArrayList is older than CopyOnWriteArrayList as it was added in java version 1.2. | CopyOnWriteArrayList class was added in java version 1.5 (or java 5). |
| 6 | Package | ArrayList class is present in java.util package. | CopyOnWriteArrayList class is present in java.util.concurrent package. |
Example of ArrayList vs CopyOnWriteArrayList
ArrayListDemo.java
import java.util.*;
public class ArrayListDemo{
public static void main(String[] args){
ArrayList l = new ArrayList();
l.add("A");
l.add("B");
l.add("C");
Iterator itr = l.iterator();
while (itr.hasNext()){
String s = (String)itr.next();
if (s.equals("B")){
itr.remove();
}
}
System.out.println(l);
}
}Output
[A,C]
Example
CopyOnWriteArrayListDemo.java
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.*;
class CopyOnWriteArrayListDemo extends Thread {
static CopyOnWriteArrayList l = new CopyOnWriteArrayList();
public static void main(String[] args) throws InterruptedException{
l.add("A");
l.add("B");
l.add("C");
Iterator itr = l.iterator();
while (itr.hasNext()){
String s = (String)itr.next();
System.out.println(s);
if (s.equals("B")){
// Throws RuntimeException
itr.remove();
}
Thread.sleep(1000);
}
System.out.println(l);
}
}Output
A B Exception in thread "main" java.lang.UnsupportedOperationException