티스토리 뷰
- 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
'프로그래밍 > Java' 카테고리의 다른 글
[Stream API] 중간 연산 - distinct 메서드 (0) | 2020.12.31 |
---|---|
[Stream API] 중간 연산 - filter 메서드 (2) | 2020.12.30 |
Intellij IDEA에서 Gradle을 사용해 Java Preview 버전의 코드 테스트하기. (0) | 2020.10.28 |
[Java 14] Helpful NullPointerExceptions (0) | 2020.08.12 |
[Java 14] Enhanced Switch Expressions (2) | 2020.08.04 |
- Total
- Today
- Yesterday
- IntelliJ
- #예제 #example #가계부 #Account Book
- mapToObj
- flaMap
- 개발자
- Stream API
- jdk14
- java14
- 목표
- 자바
- flatMapToInt
- #배열 #array #map 함수
- 다짐
- 익명 클래스
- 충북 콕! 콕!
- import문
- lambda
- modern java
- java
- 람다
- flatMapToLong
- 계획
- 변경사항
- #React #ReactJS #리액트
- Java8
- 토이 프로젝트
- 회고
- flatMapToDouble
- 스트림
- 중간 연산
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |