남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.
1. ArrayList이란?
- List 인터페이스를 구현하기 때문 데이터 저장순서가 유지되고 중복을 허용
- Vector를 개선한 것으로 기능적인 면에서 동일
- 베이스가 배열이라서 더 이상 저장 공간이 없으면 보다 큰 새로운 배열(저장 공간)을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사(리사이징)한 다음 저장 ⇒ 미리 여유 있게 공간을 차지하도록 할당하는 것이 효율적임.
- 장점
- 읽기(접근시간)가 빠름.
- 순차적인 추가/삭제 빠름
- 단점
- 비순차적인 추가/삭제는 느림(배열을 복사하는 과정이 있기 때문)
- 비효율적인 메모리 사용
2. Vetor vs. ArrayList
- Vector는 기존에 작성된 소스와 호환성을 위해 남긴 것이기 때문 ArrayList를 사용하는 것을 권장
- Vetor는 동기화 처리가 되어 있는데, 멀티쓰레드가 아니라면 lock을 거는 작업 때문에 오베헤드가 발생한다.
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
Vector<Integer> vec = new Vector<>();
new Thread(() -> {
for(int i = 0; i < 10000; i++) {
list.add(1);
vec.add(1);
}
}).start();
new Thread(() -> {
for(int i = 0; i < 10000; i++) {
list.add(1);
vec.add(1);
}
}).start();
// 출력
new Thread(() -> {
try {
Thread.sleep(2000);
System.out.println("ArrayList의 추가된 요소 갯수 size : " + list.size());
System.out.println("Vector의 추가된 요소 갯수 size : " + vec.size());
} catch (InterruptedException ignored) {}
}).start();
}
}
실행결과
**ArrayList의 추가된 요소 갯수 size : 19497
Vector의 추가된 요소 갯수 size : 20000**
- ArrayList는 20000개 데이터를 삽입했지만 예상과는 다르게 결과가 나왔다.
- 멀티쓰레드 환경에서 ArrayList는 동기화 처리가 되어 있지 않기 때문에 RaceCondition(경쟁상태)가 발생하여 각 쓰레드에서 동시에 메서드를 호출하게 되어 예상과 다른 결과가 나왔다.
3. ArrayList 동기화 처리
public class Main {
public static void main(String[] args) {
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
new Thread(() -> {
for(int i = 0; i < 10000; i++) {
list.add(1);
}
}).start();
new Thread(() -> {
for(int i = 0; i < 10000; i++) {
list.add(1);
}
}).start();
// 출력
new Thread(() -> {
try {
Thread.sleep(2000);
System.out.println("ArrayList의 추가된 요소 갯수 size : " + list.size());
} catch (InterruptedException ignored) {}
}).start();
}
}
실행결과
ArrayList의 추가된 요소 갯수 size : 20000
4. 정리
멀티 쓰레드 환경에 동기화 처리를 해야한다면 Vector를 사용하는 것을 고려해볼 수 있지만, Collection에서 제공하는 동기화 기능을 사용하면 ArrayList도 동기화 처리가 가능하기 때문에 Vector는 사용하지 말자!
'Programming > Java' 카테고리의 다른 글
[Java] 스택, 큐, 우선순위 큐, 덱 이란? (0) | 2023.11.03 |
---|---|
[Java] LinkedList, ArrayList 비교 (0) | 2023.11.03 |
[Java] DI 프레임워크 Google Guice 정리 (0) | 2023.11.03 |
[Java] 네트워크 프로그래밍 - 1(IP, URL, URLConnection) (0) | 2023.11.03 |
[Java] 람다식(Lambda) (0) | 2023.11.03 |