Collection과 Map


어디에 담아야 하는지?

배열은 처음부터 크기를 지정해야 하지만,
Collection의 객체 대부분은 그럴 필요 없이 객체들이 채워질 때마다 자동으로 크기가 증가된다.

Collection 및 Map 인터페이스의 이해


Set 인터페이스

HashSet과 LinkedHashSet의 성능이 비슷하고, TreeSet의 순서로 성능 차이가 발생한다.
(LinkedHashSet > HashSet > TreeSet)

TreeSet은 데이터를 저장하면서 정렬한다.
데이터를 순서에 따라 탐색해야 하는 경우에는 TreeSet을 사용하는 것이 좋다.
하지만 그럴필요가 없을 때는 HashSet이나 LinkedHashSet을 사용하는 것을 권장한다.


List 인터페이스

구현된 클래스에는 ArrayList와 Linked-List 클래스가 있으며, 원조 클래스 격인 Vector 클래스가 있다.


(1) 데이터를 넣는 속도 비교
데이터를 넣은 것은 어떤 클래스든 큰 차이가 없다.

(2) 순차적으로 결과를 받아오는 속도 비교 (list.get(index))
ArrayList가 가장 빠르고, Vector과 LinkedList는 속도가 매우 느리다.
LinkedList가 Queue 인터페이스를 상속받기 때문이다.
이를 수정하기 위해서는 순차적으로 결과를 받아오는 peek()나 poll() 메서드를 사용해야 한다.

수정 후, 테스트를 다시 해보면
ArrayList, LinkedList, Vector 순으로 빠르게 바뀐다.

Q. ArrayList와 Vector의 성능 차이는 왜 이렇게 큰가?
A. Vector은 여러 스레드에서 접근할 경우를 방지하기 위해서
get() 메서드에 synchronized가 선언되어 있다.
그래서 성능 저하가 발생할 수밖에 없다.
ArrayList는 여러 스레드에서 접근할 경우 문제가 발생할 수 있다.

(3) 데이터를 삭제하는 시간 비교
첫 번째 값 삭제와 마지막 값 삭제 속도의 차이가 크다.

LinkedList는 별 차이가 없지만, ArrayList나 Vector은 실제로 그 안에 배열을 사용한다.
그래서 ArrayList와 Vector의 첫번째 값을 삭제하면 느릴 수 밖에 없다.


Map 인터페이스

Map은 key-value 쌍으로 저장되는 구조체이다.
그래서 Map은 단일 객체만 저장하는 다른 Collection API들과는 다르게 따로 분리되어 있다.

구현한 클래스들은 HashMap, TreeMap, LinkedHashMap 세 가지와
원조 클래스 격인 Hashtable 클래스가 있다.

대부분의 클래스가 동일하지만,
트리 형태로 처리하는 TreeMap 클래스가 가장 느리다.


Queue 인터페이스

Queue는 데이터를 담아 두었다가 먼저 들어온 데이터부터 처리하기 위해서 사용된다.
List의 큰 단점은 데이터가 많은 경우 처리 시간이 늘어난다는 점이다.
가장 앞에 있는 데이터를 지우면 한 칸씩 옮기는 작업을 수행해야 하므로 느리다.

Queue 인터페이스를 구현한 클래스는 두 가지로 나뉜다.

Queue 구현 클래스

블로킹 큐(blocking queue)란 크기가 지정되어 있는 큐에 더 이상 공간이 없을 때,
공간이 생길 때까지 대기하도록 만들어진 큐를 의미한다.


Collection 관련 클래스의 동기화

HashSet, TreeSet, LinkedHashSet, ArrayList, LinkedList,
HashMap, TreeMap, LinkedHashMap은 동기화되지 않은 클래스이다.
(JDK 1.2 버전 이후에 만들어짐)

동기화되어 있는 클래스로는 Vector와 Hashtable이 있다.
(JDK 1.0 버전에 만들어짐)

Collection 클래스에는 최신 버전 클래스들의 동기화를 지원하기 위한 synchronized로 시작하는 메서드들이 있다.
synchronized: 현재 데이터를 사용하고 있는 해당 스레드를 제외하고
나머지 스레드들은 데이터에 접근할 수 없도록 막는 개념

synchronized 키워드를 너무 남발하면 오히려 성능 저하를 일으킬 수 있다.
자바 내부적으로 blocking, non-blocking 처리를 하기 때문이다.