Java Vector / ArrayList
Vector와 ArrayList
Vector란?
- Vector는 확장 가능한 배열의 구현체이다.
- List 인터페이스의 구현체이다.
- Java Collections 프레임워크가 없던 시절, 초기 자바 버전에 포함이 되어 있었다.
- 현재는 재설계되어, Collections 프레임워크에 포함되었다.
참고로 Stack 클래스는 Vector 클래스의 자식 클래스이다.
Vector의 특징
- 정수 인덱스를 사용해, 배열에 액세스할 수 있다.
- 동기화(Thread-Safe)되어있고, 한번에 하나의 쓰레드만 벡터의 메서드를 호출할 수 있다.
ArrayList란?
- ArrayList도 확장 가능한 배열의 구현체이다.
- 마찬가지로 List 인터페이스의 구현체이다.
ArrayList의 특징
- 정수 인덱스를 사용해, 배열에 액세스할 수 있다.
- 동기화되어있지 않다.
주요 차이점
동기화 여부
- Vector는 동기화 처리가 이미 되어있어, Thread-Safe 하게 동작한다.
- 즉 한번에 여러 쓰레드가 Vector 객체에 동시에 접근할 수 없고, 한번에 하나의 쓰레드가 동작하게 된다.
- ArrayList는 동기화 처리가 되어있지 않아, 동시성 문제가 발생할 수 있다.
성능
- ArrayList는 동기화되지 않았기 때문에, Vector보다 더 빠르다.
배열 확장 크기
- Vector는 모든 공간이 다 차면, capacity를 기존 크기의 2배로 확장한다.
- ArrayList는 capacity를 기존 크기의 1.5배로 확장한다.
Vector 와 ArrayList 중 선택
멀티쓰레드 환경인 경우
- Vector 사용을 고려해볼 수 있다.
- 혹은 ArrayList 에 접근할 때 동기화 처리를 한다면, ArrayList를 사용해도 좋다.
Collections.synchronizedList
메서드를 활용해도 좋다.
멀티쓰레드 환경이 아닌 경우
- 성능이 더 좋은 ArrayList를 사용하자.