ArrayList와 CopyOnWriteArrayList는 모두 Java에서 List 인터페이스를 구현한 것입니다. 그러나 몇 가지 차이점도 있습니다.
다음은 ArrayList와 CopyOnWriteArrayList의 중요한 차이점입니다.
Sr. 아니요. | 키 | 배열 목록 | CopyOnWriteArrayList |
---|---|---|---|
1 | 동기화 | ArrayList는 본질적으로 동기화되지 않습니다. | 반면에 CopyOnWriteArrayList는 본질적으로 동기화됩니다. 즉, 한 번에 하나의 스레드만 개체에 액세스할 수 있습니다. |
2 | 성능 | ArrayList는 작업에 동기화가 없기 때문에 빠릅니다. | 동기화로 인해 CopyOnWriteArrayList의 성능이 저하됩니다. |
3 | 고장 안전 | ArrayList 반복자가 빠르게 실패하고 트래버스 중 수정 시 ConcurrentModificationException이 발생합니다. | CopyOnWriteArrayList는 안전하고 트래버스 중에 수정할 수 있습니다. |
4 | 요소 제거 | ArrayList의 반복자는 반복하는 동안 제거 작업을 수행할 수 있습니다. | CopyOnWriteArrayList는 반복하는 동안 제거 작업을 수행할 수 없습니다. 그렇지 않으면 런타임 예외 UnsupportedOperationException이 발생합니다. |
5 | 자바 소개 | ArrayList는 Java 버전 1.2에 추가되었으므로 CopyOnWriteArrayList보다 오래되었습니다. | CopyOnWriteArrayList 클래스가 자바 버전 1.5(또는 자바 5)에 추가되었습니다. |
6 | 패키지 | ArrayList 클래스는 java.util 패키지에 있습니다. | CopyOnWriteArrayList 클래스는 java.util.concurrent 패키지에 있습니다. |
ArrayList 대 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); } }
출력
[A,C]
예
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); } }
출력
A B Exception in thread "main" java.lang.UnsupportedOperationException