자바에는 컬렉션(Collection Framework)가 다양하고 각각의 자료 저장 방식과 연산 성능 특성이 다르다.
이는 성능과 코딩테스트에서 정답 여부에 직결되기 때문에 컬렉션의 종류에 대해 정리를 하려고 한다.
자료 구조의 선택 기준
int[], int[][]
Arrays.sort(a);
Arrays.fill(a, value);
Arrays.copyOf(a, newLen);
Arrays.toString(a);
Arrays.deepToString(grid);
컬렉션 주요 인터페이스 및 구현 클래스

List<int[]>[] g = new ArrayList[N+1];
get(i)가 O(1)로 빠르다.contains가 O(n)이므로 빠른 존재 확인이 목적이면 부적합하다. (대신 Set/Map)list.add(x); // 추가
list.add(index, x); // 특정 위치에 삽입
list.remove(index); // 인덱스로 삭제
list.remove(Integer.valueOf(5)); // 값으로 삭제
list.sort((x,y) -> Integer.compare(x[0], y[0]));
Collections.sort(list);
Queue<int[]> q = new ArrayDeque<>();
q.offer(x); // 추가
q.poll(); // 삭제
q.peek(); // 확인
PriorityQueue<int[]> pq = new PriorityQueue<>(
// a[1] 오름차순
(a, b) -> Integer.compare(a[1], b[1]);
);
poll()로 최솟값(또는 최댓값)을 O(log n)에 얻는다.pq.offer(x); // 추가
pq.poll(); // 삭제
contains가 평균 O(1)이다.set.add(x); // 추가
set.remove(x); // 삭제
set.contains(x); // 조회
set.clear(); // 비우기
set.size(); // 크기
map.put(k, v); // 추가
map.get(k); // 조회
map.remove(k); // 삭제
map.remove(k, value); // key-value가 둘 다 일치할 때만 삭제
HashSet/HashMap 대비 느리다(log n)// TreeSet
ts.add(x); // 추가
ts.remove(x); // 삭제
ts.contains(x); // 조회
ts.lower(x); // x보다 작은 최대
ts.floor(x); // x 이하 최대
ts.ceiling(x); // x 이상 최소
ts.higher(x); // x보다 큰 최소
ts.first(); // 최솟값
ts.last(); // 최댓값
// TreeMap
tm.put(k, v); // 추가
tm.get(k); // 조회
tm.remove(k); // 삭제
tm.lowerKey(x); // x보다 작은 최대
tm.floorKey(x); // x 이하 최대
tm.ceilingKey(x); // x 이상 최소
tm.higherKey(x); // x보다 큰 최소
tm.firstKey(); // 최솟값
tm.lastKey(); // 최댓값
BFS -> ArrayDeque
다익스트라 -> PriorityQueue
방문/중복 -> HashSet
빈도수/매핑 -> HashMap
정렬 유지 + 근접 탐색 -> TreeSet / TreeMap
코테에서는 LinkedList를 잘 안 쓴다.
LinkedList를 잘 사용하지 않는 이유는 다음과 같다.
조회 속도 차이: LinkedList는 노드가 메모리에 흩어져 있어 다음 노드를 따라가며 접근해야 한다.
CPU 캐시 효율이 떨어져서 같은 O(1)이라도 조회 속도 차이가 난다.
메모리 오버헤드: LinkedList는 각 요소마다 이전/다음 노드의 주소값을 저장해야 하므로 메모리를 더 많이 사용한다.