[기본 개념] 6 | (1.2) ArrayList
1 컬렉션 프레임웍의 핵심 인터페이스
2> ArrayList
3 LinkedList
4 Stack과 Queue
5 Iterator, Listlterator, Enumeration
6 Arrays
7 Comparator와 Comparable
8 HashSet
9 TreeSet
10 HashMap과 Hashtable
11 TreeMap
12 Properties
13 Collections
14 컬렉션 클래스 정리 & 요약
2. ArrayList
기존의 Vector클래스를 개선한 것으로 Vector와 구현원리와 기능적인 측면이 동일하다. 하지만 호환성 때문에 Vector를 사용하는 것이기 때문에 가급적 ArrayList를 사용해야 한다.
ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다. 배열에 더 이상 저장할 공간이 없으면 더 큰 배열을 생성해서 기존 배열의 내용을 새로운 배열로 복사한 다음 저장한다.
메서드 | 설명 |
ArrayList( ) | 크기가 10인 ArrayList 생성 |
ArrayList(Collection c) | 주어진 컬렉션이 저장된 ArrayList 생성 |
ArrayList(int initialCapacity) | 지정된 초기용량을 갖는 ArrayList 생성 |
boolean add(Object o) | ArrayList의 마지막에 객체를 추가. 성공하면 true |
void add(int index, Object element) | 지정된 위치에 객체를 저장 |
boolean addAll(Collection c) | 주어진 컬렉션의 모든 객체를 저장 |
boolean addAll(int index, Collection c) | 지정된 위치부터 주어진 컬렉션의 모든 객체를 저장 |
void clear( ) | ArrayList를 완전히 비움 |
Object clone( ) | ArrayList를 복제 |
boolean contains(Object o) | 지정된 객체가 ArrayList에 포함되어 있는지 확인 |
void ensureCapacity(int minCapacity) | ArrayList의 용량이 최소한 minCapacity가 되도록 함 |
Object get(int index) | 지정된 위치에 저장된 객체를 반환 |
int indexOf(Object o) | 지정된 객체가 저장된 위치를 찾아 반환 |
boolean isEmpty( ) | ArrayList가 비어있는지 확인 |
Iterator iterator( ) | ArrayList의 Iterator객체를 반환 |
int lastindexOf(Object o) | 객체가 저장된 위치를 끝부터 역방향으로 검색해서 반환 |
ListIterator listIterator( ) | ArrayList의 ListIterator를 반환 |
ListIterator listIterator(int index) | ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환 |
Object remove(int index) | 지정된 위치에 있는 객체를 제거 |
boolean removeAll(Collection c) | 지정한 컬렉션에 저장된 것과 동일한 객체들을 ArrayList에서 제거 |
boolean retainAll(Collection c) | ArrayList에 저장된 객체중에서 주어진 컬렉션과 공통된 것들만 남기고 나머지는 삭제 |
Object set(int index, Object element) | 주어진 객체를 지정된 위치에 저장한다. |
int size( ) | ArryaList에 저장된 객체의 개수를 반환 |
void sort(Comparator c) | 지정된 정렬기준으로 ArrayList를 정렬 |
List subList(int fromIndex, int toIndex) | fromIndex부터 toIndex사이에 저장된 객체를 반환 |
Object[ ] toArray( ) | ArrayList에 저장된 모든 객체들을 객체배열로 반환 |
Object[ ] toArray(Object a) | ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환 |
void trimToSize( ) | 용량을 크기에 맞게 줄임 (빈 공간을 없앰) |
ArrayList는 한 요소가 삭제될 때마다 빈공간을 채우기 위해 나머지 요소들이 자리이동을 하기 때문에 올바른 결과를 얻을 수 없으므로 제어변수를 감소시켜가면서 삭제를 해야 영향을 받지 않는다.
ArrayList를 생성할 때, 자동적으로 크기가 늘어나는 과정에서 처리시간이 많이 걸리기 때문에 저장될 요소의 개수보다 여유 있는 크기로 생성하는 것이 좋다.
예제/VectorEx1.java
import java.util.*;
public class VectorEx1 {
public static void main(String[] args) {
Vector v = new Vector(5);
v.add("1");
v.add("2");
v.add("3");
print(v);
v.trimToSize(); // 빈공간을 없앤다. 용량과 크기가 같아진다.
System.out.println("=== After trimToSize() ===");
print(v);
v.ensureCapacity(6);
System.out.println("=== After ensureCapacity(6) ===");
print(v);
v.setSize(7);
System.out.println("=== After setSize(7) ===");
print(v);
v.clear();
System.out.println("=== After clear() ===");
print(v);
}
public static void print(Vector v) {
System.out.println(v);
System.out.println("size : " + v.size());
System.out.println("capacity : " + v.capacity());
}
}
실행결과
[1, 2, 3]
size : 3
capacity : 5
=== After trimToSize() ===
[1, 2, 3]
size : 3
capacity : 3
=== After ensureCapacity(6) ===
[1, 2, 3]
size : 3
capacity : 6
=== After setSize(7) ===
[1, 2, 3, null, null, null, null]
size : 7
capacity : 12
=== After clear() ===
[]
size : 0
capacity : 12
Vector의 용량과 크기에 관한 것인데 각 실행과정을 단계별로 살펴보자.
1 capacity가 5인 Vector인스턴스 v를 생성하고, 3개의 객체를 저장한다.
2. v.trimToSize( )를 호출하면 v의 빈공간을 없애서 size와 capacity를 같게 한다. 배열의 크기는 변경이 안되므로 새로운 배열을 생성해서 그 주소값을 변수 v에 할당한다. 기존의 Vector인스턴스는 더 이상 사용할 수 없고, 가비지 컬렉터(garbage collector)에 의해 메모리에서 제거된다.
3 v.ensureCapacity(6)은 v의 capacity가 최소한 6이 되도록 한다. v의 capacity가 3이므로 크기가 6인 배열을 생성해서 v의 내용을 복사해서 새로운 인스턴스를 생성했다.
4 v.setSize(7)는 v의 size가 7이 되도록 한다. 지금 capacity가 6이므로 새로운 인스턴스를 생성해야 한다. capacity가 부족하면 자동적으로 2배의 크기로 증가되어 생성되기 때문에 v의 capacity는 12가 된다.
5 v.clear( )는 v의 모든 요소를 삭제한다.
ArrayList나 Vector같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야 할 때는 상당히 효율이 떨어진다. 따라서 처음 인스턴스를 생성할 때, 여유가 있도록 인스턴스를 생성하는 것이 좋다.
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 6 | (1.4) Stack, Queue (0) | 2021.12.02 |
---|---|
[기본 개념] 6 | (1.3) LinkedList (0) | 2021.12.02 |
[기본 개념] 6 | (1.1) 컬렉션 프레임웍의 인터페이스 (0) | 2021.12.02 |
[기본 개념] 5 | (3.3) Period, Duration, 파싱, 포맷 (0) | 2021.12.01 |
[기본 개념] 5 | (3.2) Instant, LocalDateTime, ZonedDateTime, TemporalAdjusters (0) | 2021.12.01 |