[Java] Class ArrayList
JavaCollection Framework
데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 Collection : 다수의 데이터. 데이터 그룹
프레임웍 Framework : 표준화된 프로그래밍 방식.
Class ArrayList
- List 인터페이스를 구현한 클래스
저장된 순서를 유지한다.
- 기존의 Vector를 개선한 클래스
Vector와는 구현원리와 기능적인 측면에서 동일하다.
- 읽고 저장하는 것에 효율적이다.
Object 배열을 이용하여 데이터를 순차적으로 저장한다.
- 용량 변경에 비효율적이다.
처음 인스턴스 생성 시, 저장할 데이터의 개수를 잘 고려하여 충분한 용량의 인스턴스를 생성한다.
자동적으로 크기가 늘어나긴 하지만 그 과정에서 처리시간이 많이 소요된다.
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
...
transient Object[] elementData;
...
}
elementDate라는 이름의 Object 배열을 멤버변수로 선언. 모든 종류의 객체를 담을 수 있다.
Public constructors
생성자 | 설명 |
---|---|
ArrayList(int initialCapacity) | 지정된 초기 용량을 갖는 ArrayList 생성 |
ArrayList() | 크기가 10인 ArrayList 생성 |
ArrayList(Collection<? extends E> c) | 주어진 컬렉션이 저장된 ArrayList 생성 |
Public methods
반환 타입 | 이름 | 설명 |
---|---|---|
boolean | add(E e) | ArrayList의 마지막에 객체를 추가. 성공하면 true |
void | add(int index, E element) | 지정된 위치에 객체 추가 |
boolean | addAll(Collection<? extends E> c) | 주어진 컬렉션의 모든 객체 추가 |
boolean | addAll(int index, Collection<? extends E> c) | 지정된 위치부터 주어진 컬렉션의 모든 객체 추가 |
void | clear() | ArrayList를 완전히 비운다 |
Object | clone() | ArrayList 복제 |
boolean | contains(Object o) | 지정된 객체가 ArrayList에 포함되어 있는 지 확인 |
void | ensureCapacity(int minCapacity) | ArrayList의 용량이 최소한 minCapacity가 되도록 한다 |
E | get(int index) | 지정된 위치에 저장된 객체를 반환 |
int | indexOf(Object o) | 지정된 객체가 저장된 위치를 찾아 반환 |
boolean | isEmpty() | ArrayList가 비어있는 지 확인 |
Iterator | iterator() | ArrayList의 Iterator 객체를 반환 |
int | lastIndexOf(Object o) | 객체가 저장된 위치를 끝부터 역방향으로 검색해서 반환 |
ListIterator | listIterator(int index) | ArrayList의 지정된 위치부터 시작하는 ListIterator를 반환 |
ListIterator | listIterator() | ArrayList의 ListIterator를 반환 |
E | remove(int index) | 지정된 위치에 있는 객체를 제거 |
boolean | remove(Object o) | 지정한 객체를 제거. 성공하면 true |
boolean | removeAll(Collection<?> c) | 지정한 컬렉션에 저장된 것과 동일한 객체들을 제거 |
boolean | removeIf(Predicate<? super E> filter) | 지정된 조건과 일치하는 컬렉션의 모든 객체 제거 |
E | set(int index, E element) | 지정된 위치에 객체 저장 |
int | size() | ArrayList에 저장된 객체의 개수를 반환 |
void | sort(Comparator<? super E> c) | 지정된 정렬 기준으로 ArrayList 정렬 |
List | subList(int fromIndex, int toIndex) | fromIndex부터 toIndex 사이에 저장된 객체를 반환 |
Object[] | toArray() | ArrayList에 저장된 모든 객체들을 객체 배열로 반환 |
T[] | toArray(T[] a) | ArrayList에 저장된 모든 객체들을 객체 배열 a에 담아 반환 |
void | trimToSize() | 용량을 크기에 맞게 줄인다. 빈 공간 제거 |
Example01 - 기본적인 메서드로 객체 다루기
import java.util.Collections;
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
ArrayList<String> list1 = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
list1.add(String.valueOf((int) (Math.random() * 10)));
}
ArrayList<String> list2 = new ArrayList<>(list1.subList(1, 4));
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [6, 8, 0, 2, 6], list2 : [8, 0, 2]
Collections.sort(list1);
Collections.sort(list2);
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8]
System.out.println(list1.containsAll(list2)); // true
list2.add("B");
list2.add("C");
list2.add(3, "add");
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8, add, B, C]
list2.set(3, "set");
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 6, 6, 8], list2 : [0, 2, 8, set, B, C]
System.out.println(list1.retainAll(list2)); // true
System.out.println("list1 : " + list1 + ", list2 : " + list2);
// list1 : [0, 2, 8], list2 : [0, 2, 8, set, B, C]
}
}
add(int index, E element) : 객체 추가. 지정된 위치에서부터 기존 데이터들이 뒤로 밀려난다.
set(int index, E element) : 객체 저장. 지정된 위치에 기존 데이터가 있으면 새로운 데이터로 바꿔 저장한다.
Collections 클래스의 sort(List<T> list) : List에 저장된 객체들을 정렬한다.
Example02 - 공통요소 찾아서 삭제하기
!! 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리 이동을 한다.
for (int i = list2.size() - 1; i >= 0; i--) {
if (list1.contains(list2.get(i))) {
list2.remove(i);
}
}
// 전 - list1 : [0, 2, 8], list2 : [0, 2, 8, set, B, C]
// 후 - list1 : [2, 7, 8], list2 : [set, B, C]
만일 제어변수를 증가시켜가면서 삭제하면,
한 요소가 삭제될 때마다 자리 변동이 일어나 올바른 결과를 얻을 수 없다.
제어변수를 감소시켜가면서 삭제해야 자리 이동이 발생해도 영향을 받지 않고 작업이 가능하다.
Example03 - 문자열 데이터를 원하는 길이로 잘라서 ArrayList에 담기
ArrayList의 크기는 실제 저장할 개수보다 약간 여유 있게 하는 것이 좋다.
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args){
final int LIMIT = 10;
String source = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int length = source.length();
List<String> list = new ArrayList<>(length / LIMIT + 10);
for (int i = 0; i < length; i += LIMIT) {
if (i + LIMIT < length) {
list.add(source.substring(i, i + LIMIT));
} else {
list.add(source.substring(i));
}
}
for (String s : list) {
System.out.println(s);
}
}
}
abcdefghij
klmnopqrst
uvwxyz0123
456789ABCD
EFGHIJKLMN
OPQRSTUVWX
YZ
참고 서적: 자바의 정석 3판 2