일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SpringBoot 2
- Easy
- array
- scanner
- input
- hash table
- 자바입력
- R
- 사칙연산
- JAVA11
- 카데인 알고리즘
- Kadane's Algorithm
- 자바 thread 실행 순서 제어
- 수학
- 자바 스레드 실행 순서 제어
- heroku
- Today
- Total
DeFacto-Standard IT
[Java] List Interface - Vector, ArrayList 본문
공통점과 차이점
Vector와 ArrayList는 배열의 대용으로서 사용된다.
공통점 |
차이점 |
List Interface를 구현 저장순서 유지 데이터 중복 허용 저장 공간으로서 배열을 사용 |
Vector : 멀티 쓰레드에 대한 동기화 지원 O ArrayList : 멀티 쓰레드에 대한 동기화 지원 X |
Vector의 경우 멀티쓰레드에 대한 동기화가 지원이 되며
ArrayList의 경우는 동기화가 지원되지 않는다.
멀티쓰레드의 동기화 지원의 여부때문에
ArrayList보다 Vector가 나중에 나온 것이라고 생각할 수 있지만, Vector의 동기화 때문에 속도가 느려서 ArrayList가 나온 것이다.
장단점
장점 |
단점 |
데이터를 읽거나 저장할 때 효율이 좋다 |
용량을 변경할 일이 생긴다면 새로운 배열을 생성하고 복사해야 하므로 효율이 떨어진다. |
데이터 저장
Vector와 ArrayList는 Object배열을 이용하여 순차적으로 저장한다.
배열의 인덱스는 0부터 시작한다.
자바에서 한 번 정의된 배열의 저장공간이 꽉 찬 상태에서 추가적인 요소를 넣고 싶은 경우,
사이즈가 더 큰, 새로운 배열을 만들어서 이를 전부 복사하여 값을 넣은 후 추가적으로 값을 넣어야한다.
Vector와 ArrayList의 경우 겉에서는 별다른 처리가 없는 것 같지만 내부적으로는 배열을 사용한다.
따라서 엄밀히 말하자면 '배열의 전체 크기를 늘리는 것'이 아니라,
'크기가 큰 배열을 새로 정의 하고, 기존 배열을 복사' 해주는 기능을 지원하는 것 뿐이다.
내부 필드로 elementData라는 Object배열이 있어서, 모든 타입의 객체를 담을 수 있다.
접근제어자는 protected로 이를 상속받는 하위 클래스에서 elementData에 접근이 가능하다.
ArrayList선언 시 ArrayList<String>과 같이 Generic을 써서 특정 타입만 받을 수 있어 특정 Class에서 지원하는 메서드 역시 사용이 가능하다.
정렬
List Interface를 상속받는 Vector와 List는 저장 순서를 유지시킨다.
따라서 이를 정렬을 할 수 있다. Collections라는 클래스의 static method를 사용하면 된다.
Collections.sort()를 사용해서 오름차순 정렬이 가능하며,
Collections.reverse()를 사용해서 내림차순 정렬이 가능하다.
Primitive타입이 아닌, 객체를 정렬할 때는 무작정 정렬할 수가 없으므로 정렬의 기준필드가 필요하며 이를 구현할 필요가 있다.
이때 Comparator라는 인터페이스를 사용한다. Comparator Interface와 관련된 글을 참조한다.
Vector, ArrayList Methods
ArrayList의 경우 removeRange()메서드를 제외하고 모든 메서드는 Vector와 동일하다
Vector의 경우 기존에 작성된 소스코드와 호환성을 유지하면서 List Interface를 구현해야해서 이름만 다르고 같은 기는을 하는 메서드가 많다.
메서드 |
설명 |
Vector() |
Vector객체를 생성한다. 기본 크기는 10이다. |
Vector(Collection c) |
Collection c를 저장할 수 있는 Vector객체를 생성 |
Vector(int initialCapacity) |
초기용량이 initialCapacity인 Vector객체를 생성한다. |
Vector(int initialCapacity, int capacityIncrement) |
초기용량이 initialCapacity이고 용량의 증분값이 capacityIncrement인 Vector객체를 생성한다. |
void add(int index, Object o) |
index위치에 객체 o 저장 |
boolean add(Object o) |
객체 o를 저장한다. 성공 시 true, 실패 시 false 리턴 |
boolean addAll(Collection c) |
Collection c를 저장한다. |
boolean addAll(int index, Collection c) |
index위치부터 Collection c를 저장한다. |
void addElement(Object o) |
객체 o를 저장한다. |
int capacity() |
Vector에 선언된 배열의 총 용량 반환 |
void clear() void removeAllElements() |
Vector에 저장된 모든 요소를 삭제 |
Object clone() |
Vector를 복제 |
boolean contains(Object o) boolean containsAll(Collection c) |
객체 o또는 Collection c가 Vector에 포함되어 있는지 확인 |
void copyInto(Object[] arr) |
저장된 객체들을 Object배열 arr배열에 저장 |
Object elementAt(int index) |
index위치에 저장된 객체 반환 |
Enumeration elements() |
저장된 모든 객체 반환 |
void ensureCapacity(int minCapacity) |
용량이 최소 minCapacity가 되도록 세팅 |
boolean equals(Object o) |
객체 o와 같은지 비교 |
Object firstElement() |
가장 첫 번째에 저장된 객체 반환 |
Object get(int index) |
index위치에 저장된 객체 반환 |
int hashCode() |
해시코드 반환 |
int indexOf(Object o) |
o객체가 저장된 위치 반환 |
int indexOf(Object o, int index) |
o객체가 저장된 위치를 index위치부터 찾아 반환 |
void insertElementAt(Object o, int index) |
객체 o를 index위치에 삽입 |
boolean isEmpty() |
Vector가 비어있는지 확인 |
Object lastElement() |
가장 마지막에 저장된 객체 반환 |
int lastIdexOf(Object o) |
객체 o가 저장된 위치를 끝에서 부터 역방향으로 검색하여 위치 반환 |
int lastIndexOf(Object o, int index) |
객체 o가 저장된 위치를 index위치부터 역방향으로 검색하여 위치 반환 |
Object remove(int index) |
index위치에 있는 객체 제거 후 반환 |
boolean remove(Object o) boolean removeElement(Object o) |
객체 o제거. 성공 시 true, 실패 시 false 리턴 |
boolean removeAll(Collection c) |
Collection c에 저장되어있는 요소와 동일한 객체를 Vector에서 제거 |
void removeElementAt(int index) |
index위치에 저장된 객체 삭제 |
boolean retainAll(Collection c) |
Vector에 저장된 것 중 Collection c와 동일한 것을 제외하고 모두 삭제 |
Object set(int index, Object o) void setElementAt(Object o, int index) |
객체 o를 index위치에 삽입 |
void setSize(int newSize) |
Vector의 크기를 newSize크기로 변경 |
int size() |
현재 저장된 객체의 갯수 반환 |
List subList(int fromIndex, int toIndex) |
fromIndex부터 toIndex까지 저장된 객체를 서브리스트로 반환 |
Object[] toArray() |
저장된 모든 객체를 배열로 반환 |
Obejct[] toArray(Object[] arr) |
저장된 모든 객체를 배열 arr에 담아 반환 |
String toString() |
저장된 모든 객체를 문자열로 출력 |
void trimToSize() |
용량을 크기에 맞게 줄여 빈 공간을 제거 |
Object remove(int index)
index위치에 있는 객체를 삭제하고, 삭제한 객체를 반환한다.
중간에 있는 객체가 삭제된다면, 바로 다음 객체를 복사하여 삭제할 객체를 덮어쓰는 방식으로 처리된다.
계속 삭제를 하다가 마지막 객체를 삭제할 때는 그냥 null을 할당한다.
내부적으로 System.arraycopy()를 사용한다.
이는, 삭제할 위치의 객체 이후에 복사, 삭제할 객체가 많을수록 작업시간이 오래걸린다는 것을 의미한다.
Java API소소는
JDK설치폴더\src.zip\java\util\Vector.java에 존재한다.
'Java > Collection' 카테고리의 다른 글
Collection Sheet & Selection (0) | 2017.11.17 |
---|---|
[Java] List Interface (0) | 2017.10.03 |
[Java] Collection Interface (0) | 2017.10.03 |