티스토리 뷰

- open_jdk 8u40-b25를 기반으로한 자료 -


Vector 클래스


● List 인터페이스를 구현한 클래스 중 하나로 내장 클래스이다.

● 경로명은 java.util.Vector이다

가변 배열을 사용하기 위한 클래스이다.

● JDK 1.0에서 추가되었다.

● 제네릭(Generic)을 지원한다.

● 초기 배열 크기를 지정하지 않으면 초기 배열의 크기(initial capacity)는 10이다.

● 초기 배열 크기 증가 값을 지정하지 않으면 배열의 크기가 2배씩 커진다.


Vector 클래스의 연산


● 삽입

- 기본적으로 데이터가 순서대로 삽입된다.

- 기존 배열이 가득차 있을 경우에 배열 크기가 더 큰 새로운 배열을 만들어 기존 배열의 내용을 복사한 후 데이터를 삽입한다.

- 중간 삽입이 가능하다.

- 중간에 삽입할 경우 삽입하려는 위치보다 뒤의 데이터들을 한 칸씩 뒤로 이동시킨후 데이터를 삽입한다.

● 삭제

- 인덱스를 통해 데이터를 삭제하거나 값을 통해 데이터를 삭제할 수 있다.

- 중간 데이터가 삭제되면 뒤의 데이터들을 한 칸씩 앞으로 이동시킨다.

● 검색

- 배열의 인덱스를 통해 저장된 데이터를 검색한다.


ArrayList 클래스


● List 인터페이스를 구현한 클래스 중 하나로 내장 클래스이다.

● 경로명은 java.util.ArrayList이다.

가변 배열을 사용하기 위한 클래스이다.

● JDK 1.2(Java 2)에서 추가되었다.

● 제네릭(Generic)을 지원한다.

● 초기 배열 크기를 지정하지 않으면 초기 배열의 크기(initial capacity)는 10이다.

● 별도로 배열 크기의 증가값을 지정할 수 없고 배열의 크기가 1.5배씩 커진다.

Vector 클래스와 필드 및 메소드의 역할이 거의 유사하다.


ArrayList 클래스의 연산


Vector 클래스와 유사하다.


Vector 클래스와 ArrayList 클래스의 차이점 


Vector 클래스의 경우 메소드가 동기화를 지원한다.

- 단일 스레드 작업에서 이런 동기화 때문에 성능 저하가 발생

- 성능 저하로 인해 현재 Vector 클래스는 이전에 작성된 코드들과의 호환성을 위해서 사용되며 자주 사용되지 않는다.

- 동기화가 필요한 경우 Collections.synchronizedList() 메소드를 이용해서 ArrayList 클래스를 동기화해서 사용한다.

● Vector 클래스의 배열 크기 증가량과 ArrayList 클래스의 배열 크기 증가량이 다르다.

- Vector의 경우 : newCapacity = oldCapacity + ((capacityIncrement > 0)? capacityIncrement: oldCapacity)

· 설정된 배열 크기 증가분만큼 증가하거나 기존 크기의 2배로 증가

- ArrayList의 경우 : newCapacity = oldCapacity + (oldCapacity >> 1)

· 무조건 기존 배열 크기의 Shift Right 1 Bit(2로 나눈 효과) 만큼 증가(1.5배)

● Vector 클래스는 capacity() 메소드를 통해서 배열의 크기(capacity)를 알 수 있지만 ArrayList 클래스는 일반적으로 배열의 크기를 알 수 없다. (Reflection을 이용해서 구할 수 있음)

● Vector 클래스는 기본 capacity가 10이지만 ArrayList 클래스는 capacity를 지정하지 않을 경우 크기가 0인 빈 배열로 elementData를 초기화 하기 때문에 기본 capacity가 0이라고 볼 수 있다.

public int getCapacity(ArrayList<?> l) throws Exception {
Field dataField = ArrayList.class.getDeclaredField("elementData");
dataField.setAccessible(true);
return ((Object[]) dataField.get(l)).length;
}

public void arrayListCapacityTest() throws Exception {
ArrayList<String> list = new ArrayList<> ();
System.out.println("init: " + getCapacity(list));
list.add("test");
System.out.println("Data added: " + getCapacity(list));
}

- 위 코드를 실행해보면 capacity를 정하지 않은 ArrayList는 최초에 capacity가 0이었다가 데이터를 하나 추가하는 순간 10이 되는 것을 알 수 있다.


Vector 클래스와 ArrayList 클래스 내부


※ 실제 OpenJDK의 내용을 통해 참고 바람.

[Vector 클래스] http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Vector.java#Vector

[ArrayList 클래스] http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java#ArrayList

[ArrayList의 기본 Capacity] https://javapapers.com/core-java/java-collection/difference-between-vector-and-arraylist-in-java/#:~:text=Vector%20and%20ArrayList%20both%20uses,They%20are%20dynamically%20resizable.&text=But%2C%20ArrayList%20increases%20by%20half,ArrayList's%20methods%20are%20not%20synchronized.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함