ArrayList
by 민갤
Collection Framework
데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 Collection : 다수의 데이터. 데이터 그룹
프레임웍 Framework : 표준화된 프로그래밍 방식.
Java.util.ArrayList Class
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() | 크기가 0인 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에 저장된 모든 객체들을 객체배열로 반환 |
toArray(T[] a) | ArrayList에 저장된 모든 객체들을 객체배열 a에 담아 반환 | |
void | trimToSize() | 용량을 크기에 맞게 줄인다. 빈 공간 제거 |
Example01 - 기본적인 메서드로 객체 다루기
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
ArrayList list1 = new ArrayList(10);
for (int i = 0; i < 5; i++) {
list1.add((int) (Math.random() * 10));
}
ArrayList list2 = new ArrayList(list1.subList(1, 4));
print(list1, list2); // list1 : [8, 7, 6, 7, 4], list2 : [7, 6, 7]
Collections.sort(list1);
Collections.sort(list2);
print(list1, list2); // list1 : [4, 6, 7, 7, 8], list2 : [6, 7, 7]
Log.d("TAG_TEST", list1.containsAll(list2) + ""); // true
list2.add("B");
list2.add("C");
list2.add(3, "add");
print(list1, list2); // list1 : [4, 6, 7, 7, 8], list2 : [6, 7, 7, add, B, C]
list2.set(3, "set");
print(list1, list2); // list1 : [4, 6, 7, 7, 8], list2 : [6, 7, 7, set, B, C]
Log.d("TAG_TESG", list1.retainAll(list2) + ""); // true
print(list1, list2); // list1 : [6, 7, 7] , list2 : [6, 7, 7, set, B, C]
}
public void print(ArrayList list1, ArrayList list2) {
Log.d("TAG_TEST", "list1 : " + list1 + ", list2 : " + list2);
}
}
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 : [6, 7, 7], list2 : [6, 7, 7, set, B, C]
// 후 - list1 : [6, 7, 7], list2 : [set, B, C]
만일 제어변수를 증가시켜가면서 삭제하면, 한 요소가 삭제될 때마다 자리 변동이 일어나 올바른 결과를 얻을 수 없다.
제어변수를 감소시켜가면서 삭제해야 자리이동이 발생해도 영향을 받지 않고 작업이 가능하다.
Example03 - 문자열 데이터를 원하는 길이로 잘라서 ArrayList에 담기
ArrayList의 크기는 실제 저장할 개수보다 약간 여유 있게 하는 것이 좋다.
final int LIMIT = 10;
String source = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int length = source.length();
List 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 (int i = 0; i < list.size(); i++) {
Log.d("TAG_TEST", list.get(i) + "");
}
D/TAG_TEST: abcdefghij
D/TAG_TEST: klmnopqrst
D/TAG_TEST: uvwxyz0123
D/TAG_TEST: 456789ABCD
D/TAG_TEST: EFGHIJKLMN
D/TAG_TEST: OPQRSTUVWX
D/TAG_TEST: YZ
• 참고 서적: 자바의 정석 3판 2