JAVA

컬렉션_ArrayList

고민말고생각하는사람 2024. 2. 14. 23:20

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는 순차적인 삭제 등에 대해 좋은 성능을 낼 수 있다.