ArrayList
Last updated
Last updated
참고 링크
Object
-> Collection
-> List
-> ArrayList
순으로 확장한 것을 확인할 수 있다.
Serializable
: 직렬화 여부 판단. 원격으로 객체를 전송, 파일 I/O 가능
Cloneable
:Object
클래스의clone()
메서드 사용여부 판단.
Iterable<E>
: forEech 구문 사용 가능
Collection<E>
: 여러개의 데이터를 한 객체에 담아 처리할 메소드 지정
List<E>
: 순서가 보장되며, 중복을 허용하는 목록형 데이터 집합을 의미
RandomAccess
:
컬렉션이 인덱스 기반으로 빠른 임의 접근(Random Access) 을 지원한다는 신호를 제공하는 역할을 한다.
즉,
ArrayList
같은 컬렉션은 인덱스를 사용한 요소 접근(get(index)
또는set(index, value)
)이 상수 시간(O(1)) 안에 이루어진다는 것을 나타냅니다.
RandomAccess
는 마커 인터페이스이다.
마커 인터페이스(Mark Interface)
Java에서 마커 인터페이스는 구체적인 메서드를 포함하지 않으며, 특정 클래스가 어떤 기능을 가지고 있음을 표시하기 위해 사용 (정보성)
즉 마커 인터페이스는 정보성이지, 기능을 가지고 있는 것이 아니다. (빼도 기능적으로 문제는 없다)
ArrayList()
: 객체를 저장할 공간이 10개인 ArrayList 객체를 만든다.
10 이상의 데이터가 들어가면 크기를 늘리는 작업이 ArrayList
내부에서 자동으로 수행된다.
-> 객체가 생성될 때 배열이 생성되는 것이 아닌, 첫 번째 요소가 추가될 때 크기가 10인 배열이 생성된다.
또한 크기가 다 차면 1.5배씩 배열의 크기는 증가한다. -> 해당 작업은 애플리케이션 성능에 영향을 주는 작업으로, 크기가 예상이 된다면 초기에 지정해주는 것이 좋다.
ArrayList(Collection<? extend E> c)
: 매개변수로 넘어온 컬렉션 객체가 저장되어 있는 ArrayList
를 만든다.
ArrayList(int initialCapacity)
: 매개변수만큼의 저장공간을 갖는 ArrayList
를 만든다.
boolean add(E e)
: 매개변수로 들어온 데이터를 가장 끝에 담는다.
void add(int index, E e)
: 매개변수로 들어온 데이터를 지정된 index 위치에 담는다.
해당 위치에 데이터를 추가하게 되면, 뒤의 데이터는 복사가 일어나게 된다.
-> ArrayList
의 가장 큰 문제점이다.
boolean addAll(Collection<? extends E> c)
: 매개변수로 넘어온 컬렉션 데이터를 가장 끝에 담는다.
Collection
관련 객체를 복사할 일이 있을 때에는, 생성자 혹은 addAll()
메서드를 사용하는 것이 좋다.
boolean addAll(int index, Collection<? extend E> c)
: 매개변수로 넘어온 컬렉션 데이터를 index 에 지정된 위치부터 담는다.
Int size()
: Collection 을 구현한 객체에 들어가 있는 데이터의 갯수 리턴.
배열.length
는 배열의 저장 공간 개수를 의미하지만,
size()
메서드는 객체 안에 들어가 있는 데이터의 갯수를 의미한다.
E get(int index)
: 매개변수에 지정한 위치에 있는 데이터 리턴.
int indexOf(Object o)
: 매개변수로 지정한 객체와 동일한 데이터의 위치를 리턴.
int lastInedexOf(Object o)
: 매개변수로 지정한 객체와 동일한 마지막 데이터의 위치를 리턴.
void clear()
: 모든 데이터 삭제
E remove(int index)
: 매개 변수에서 지정한 위치에 있는 데이터를 삭제하고 삭제한 데이터를 리턴
boolean remove(Object o)
: 매개 변수에 넘어온 객체와 동일한 첫 번째 데이터를 삭제
boolean removeAll(Collection<?> c) : 매개변수로 넘어온 컬렉션 객체에 있는 데이터와 동일한 모든 데이터를 삭제
Object[] toArray()
: Object 타입의 배열로 반환
Object
타입으로 받기 때문에, 형 변환이 필요하다.
<T> T[] toArray(T[] a)
: 특정 타입의 배열로 변환 (일반적으로 많이 사용하는 방법)
원하는 타입을 지정해 줄 수 있기 떄문에, 형 변환이 필요하지 않다.
전달된 배열의 크기가 ArrayList 의 크기 보다 작으면 새로운 배열이 생성된다.
제공된 배열의 크기가 적절한 경우에는 기존 배열이 사용된다.
E set(int index, E element)
: 지정한 위치에 해당 객체로 바꿔친다.
ArrayList
를 멀티 쓰레드 환경에서 사용할 수 있도록 Collections.synchronizedList()
메서드가 제공된다.
아래 코드와 같이 컬렉션 내 많은 객체를 동기화 처리 해준다.
최선 : O(1)
요소가 배열의 끝에 추가되고, 배열의 크기 조절이 필요 없는 경우
최악 : O(n)
배열이 가득 차서 새로운 배열을 생성하고 기존 요소를 복사해야 하는 경우
최선 : O(1)
인덱스를 통해서 배열에 접근하기에 항상 O(1) 이다.
최악 : O(1)
최선 : O(1)
인덱스를 통해서 배열에 접근하기에 항상 O(1) 이다.
최악 : O(1)
최선: O(1)
삭제하려는 요소가 배열의 마지막 요소일 때, 삭제 후 배열 크기를 줄이지 않으므로 O(1)입니다.
최악: O(n)
삭제하려는 요소가 배열의 중간에 위치할 때, 삭제 후 뒤에 있는 요소들을 앞으로 이동시켜야 하므로 O(n)입니다.