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

위 사진에서 볼 수 있듯 Collection은 우선 Interface이다. 그 하위에 있는 Subinterface도 무지많고, 구현체는 더 많은걸 확인할 수 있다.
구현체를 위주로 한번 살펴보자면 크게 3가지로 볼 수 있는데, Queue와 Deque는 그냥 나눠서 4개로 확인해보자
AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet
요소의 중복을 허용하지 않는 컬렉션이다. null이 최대 한개 포함될 수 있다.
add(E e) : 해당 요소를 이 Set에 추가한다.
clear() : 요소 전부 삭제
contains(Object o) : 요소가 해당 Set에 있으면 true 반환
equals(Object o) : 해당 객체와 이 세트가 동일한지 확인
remove(Object o) : 해당 요소를 삭제
toArray() : 이 세트의 모든 요소를 포함하는 배열 반환 -> T[] y = x.toArray(new T[0]);
Set 인터페이스의 기본 메서드를 구현하는 추상 메서드다.
equals, hashCode, removeAll이 구현되어 있으며, iterator과 size는 추상메서드로 선언되어있다.
이를 이용하면 커스텀 Set구현이 가능하다.
NavigableSet의 구현체이다. Skip List라는 구조를 기반으로 하며 Comparable에 따라 정렬되거나 Comparator 세트 생성을 통해 정렬 방식 설정이 가능하다.
contains, add, remove의 시간 복잡도가 log(n)이며, 이 작업들을 멀티스레드에서 안전하게 실행된다.
모든 연산에 Set 내부를 사용하는 구현체이다. 홈페이지 설명으론 다음과 같다.
Enum타입을 위한 Set이다. 비트 벡터를 이용해서 구현했고, Enum 상수들만 포함할 수 있다.
Enum상수는 개발자가 직접 선언하기 때문에 개수가 고정되어 있어서 비트 필드가 매우 유용하다.
대부분의 연산이 O(1)시간복잡도를 갖을 정도로 성능이 좋고, Enum 타입만 저장이 가능해서 타입 안정성 또한 보장되며, Enum 상수의 선언 순서를 유지해서 순서가 중요할시 유용하다.
EnumSet.allOf(Class<E> elementType): 주어진 Enum 클래스의 모든 상수를 포함한다.
EnumSet.noneOf(Class<E> elementType) : 빈 EnumSet을 생성한다.
EnumSet.of(E e, E... others) : 하나 이상의 상수를 포함하는 EnumSet을 생성
EnumSet.range(E from, E to) : 지정된 범위의 상수를 포함하는 EnumSet 생성
hash테이블을 사용해서 요소를 저장하는 Set이다.
해시 테이블을 사용하기 때문에 검색, 추가, 삭제 작업이 O(1)이지만, 해시 충돌시 성능이 저하된다.
다만, 여러 스레드가 해시 세트에 동시에 액세스하면 동기화 되지 않기 대문에 외부 동기화가 필요하다.
HashSet을 확장한 열거형이다.
Job의 현재 상태에 해단 추가 정보를 제공하는 열거형 값의 집합인 enum형 Set이다.
Spring Batch의 작업 단위인 Job을 대상으로 한다.
Hash Table + LinkedList를 Set으로 구현했다.
삽입 순서를 유지하며 HastSet의 성능까지 챙겼다. 즉, 검색, 추가, 삭제 작업이 O(1)이지만, 순서 유지로 인해 추가적인 메모리 오버헤드는 발생한다.
Red-Black Tree라는 균형 이진 탐색 트리를 사용해 요소를 저장한다.
이진 탐색 트리 속성에 의해서 검색,추가,삭제 연산이 O(log n) 시간복잡도를 갖는다.
이진 탐색이라 요소가 자동으로 정렬되고 Null이 허용되지 않는다.