컬렉션을 사용하긴 하지만, 더 자세히 알아보도록 하자.

위 사진에서 볼 수 있듯 Collection은 우선 Interface이다. 그 하위에 있는 Subinterface도 무지많고, 구현체는 더 많은걸 확인할 수 있다.
구현체를 위주로 한번 살펴보자면 크게 3가지로 볼 수 있는데, Queue와 Deque는 그냥 나눠서 4개로 확인해보자
AbstrackList, AbstractSequentialList, ArrayList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Vector
기본적으로 순서가 있는 요소의 집합이다. List의 구현체들은 요소들이 인덱스를 통해 접근하며, 요소 중복이 허용된다. add, get, set, remove가 CRUD 메소드다.
이름에서 알 수 있듯, List 인터페이스를 구현한 추상 클래스다. 새로운 List 구현을 만들때 AbstrackList를 상속받아서 구현하면 된다.
이 역시 이름에서 알 수 있듯 List 인터페이스를 구현한 추상 클래스다. 다만, AbstrackList와 다른점은 데이터 구조에 순차적으로 접근하도록 설계 되었다. 우리가 아는 LinkedList와 같은 구조.
List가 get(idx)로 접근하기 때문에 원래가 순차적이라고 할 수 있지만, 사실 List는 랜덤 접근 기반 구현이다.
AbstrackList를 상속받고 List, RandomAccess, Cloneable, Serializable를 구현한 List의 구현체다.
크기 조절이 가능한 배열로 잘 알려져있으며, 생성자는 총 3종류가 있다.
ArrayList<>() : 초기 용량이 10인 빈 List
ArrayList(Collection<? extends E> c) : 컬렉션 c의 모든 요소를 복사해서 List로 만든다.
ArrayList<>(size) : 초기 용량이 size인 빈 List
메소드는 좀 많은데, 대표적인거만 보면 다음과 같다.
add(int idx,E e):지정된 요소를 idx에 삽입한다. 생략하면 가장 뒤에 추가한다.
addAll(int index, Collection<? extends E> c) : 컬렉션을 전부 idx 부터 추가한다. 생략하면 가장 뒤에
get(int idx) : 해당 위치에 있는 요소 반환
contains(Object o) : 이 인스턴스에 o 가 있으면 true
indexOf(Object o) : 이 요소가 있는 idx 반환, 없으면 -1
remove(int idx) : 해당 인덱스의 요소 삭제
remove(Object o) : 가장 앞에있는 o 삭제
removeRange(int start,int end) : 범위삭제
clear() : 모든 요소 삭제
'set(int idx, E element)' : 해당 idx의 요소를 element로 수정
size() : 저장된 요수의 수 반환
subList(int from, int to) : from~to-1까지의 원소를 갖는 List 생성
toArray() : List를 Array로 변환후 반환
equlas,toString,..
ArrayList에서 쓰레드 안전성을 추가한 버전이라고 보면 된다.
읽기 작업이 많은 멀티쓰레드 환경에서 효울적이며, 쓰기 작업 수행마다 내부 배열을 복사하는 특징이 있다.
읽기는 시간복잡도가 O(1)로 매우 빠르지만, 쓰기는 O(n)로 좀 느리다. 그 이유는 복사를 하기 때문.
LinkedList는 위에서 언급한 AbstractSequentialList를 상속하고, List, Dequq, Clonable, Serializable을 구현했다.
ArrayList와 메소드는 거의 공유한다고 보면 된다. 다만, Dequq(양방향 Queue)를 구현해서 Queue 기능이 추가되었는데, 그건 Dequq에서 설명할 예정.
get: O(1) vs O(n)
add: O(n) vs O(1)
remove : O(n) vs O(1)
사실 ArrayList에 add, remove도 index지정 안하면 O(1)인데, 일반성을 위해서 무작위 index로 가정했다.
위에서 시간복잡도를 통해 예측이 가능한데, ArrayList는 접근이 빠른 장점이 있다. 즉 읽기 중심 작업에 특화되어 있고,
LinkedList는 추가, 삭제가 빠른 장점이 있지만, 접근이 느린 단점이 있는걸로 보아 쓰기 중심 작업에 특화되어 있음을 알 수 있다.
ArrayList를 상속받는 객체이다. 관계를 생성할 때 매개변수로 사용된다.
ArrayList를 상속받는 객체이다. Role에 엑세스시 문제가 발생하여 검색되지 않는 Role을 나타내는 RoleUnresolved의 목록을 나타낸다.
AbstractList를 상속받고 List, RandomAccess, Cloneable, Serializable를 구현한 동기화 List이다.
ArrayList와 유사하지만 사용 목적이 다르다.
List를 구현했기 때문에 메소드는 대부분 동일하다.