컬렉션_ArrayList
ArrayList란?
- List 인터페이스의 구현체 중 하나
- 순서를 보장하고, 중복을 허용함
- 기존에 있던 Vector 를 개선한 것으로, 구현 원리, 기능 등일 동일함.
- Vector 는 자체적으로 동기화 처리가 돼 있음. (아직 뭔 소린지 모름ㅎ)
- 이름에서 알 수 있듯, 배열기반임.
- 모든 종류의 객체를 저장할 수 있음. (Obejct[])
ArrayList의 메서드
ArrayList() - 기본 생성자
ArrayList(Collection c) - 컬렉션을 인자로 넣으면 ArrayList로 반환됨.
ArrayList(int initalCapacity) - 초기 배열 길이
boolean add(Obejct o) - 객체 저장
boolean remove( Obejct o ) - 객체 삭제
void clear() - 모든 객체 제거
int indexOf( Obejct o ) - 객체의 인덱스 반환. 없으면 -1 반환
boolean contains( Obejct o) - 객체 존재 유무 확인
Obejct get(int index) - 객체 읽기
Obejct set(int index, Object element) - 변경(덧씌우기)
Object[] toArray() - ArrayList 객체 배열 반환함
Object[] toArray(Object[] a)
boolean isEmpty() - 비어있는지 확인
void trimToSize() - 빈 공간 제거
int size() - 저장된 객체 갯
ArrayList 장점
순차적 삽입, 삭제에서 좋은 퍼포먼스를 보인다.(빠르다)
ArrayList 단점
중간 지점으로의 삽입, 삭제 등에서 비용이 많이 발생한다.
머선 말인지 모르겠지? 이어서 봐 보자.
ArrayList 에 저장된 객체의 삭제 과정
| data[0] | data[1] | data[2] | data[3] | data[4] |
| 0 | 1 | 2 | 3 | 4 |
위와 같은 형태의 배열이 있을 때, index - 2 에 있는 값을 지우면 어떻게 될까?
아래와 같은 프로세스가 진행된다.
1. index 3~ 끝까지의 배열을 복사하여, index2 위로 덮어 씌운다.
// data 배열에서, index-3 부터 값들을 복사하여, data 배열의 2번째 인덱스 위치에 2개 붙여 넣으라는 코드
System.arraycopy(data, 3, data, 2, 2)
| data[0] | data[1] | data[2] | data[3] | data[4] |
| 0 | 1 | 3 | 4 | 4 |
2. 모두 복사했다면(옮겼다면) 마지막 위치의 값은 무의미해지므로, 없앤다. Null로 초기화-> data[size-1] = null;
3. size--;
중간에 있는 값을 지우기 위해, 배열의 복사, 붙여넣기 등이 발생했다. (비용이 많이 발생하게 된다)
반면,
1. 끝에 있는 값만 지운다면,
| data[0] | data[1] | data[2] | data[3] | |
| 0 | 1 | 2 | 3 |
2의 배열 복사, 붙여넣기 과정이 필요 없어진다.
따라서, ArrayList는 순차적인 삭제 등에 대해 좋은 성능을 낼 수 있다.