자바 성능 튜닝 - 컬렉션
Collection의 종류
Set : 중복을 허용하지 않는 집합을 처리하기 위한 인터페이스
List : 순서가 있는 집합을 처리하기 위한 인터페이스이며 인덱스가 있어 위치를 통해 값을 찾을 수 있음, 중복 허용
Queue : 여러 객체를 처리하기 전에 담아서 사용하기 위한 인터페이스이며 FIFO를 따름
Map : Key-Value 로 구성된 객체의 집합을 처리하기 위한 인터페이스이며 중복된 Key를 허용하지 않음
Set
- 중복이 없는 집합 객체를 만들때 유용합니다.
- HashSet : 해쉬 테이블에 담는 클래스로 순서없이 저장
- TreeSet : 이진 트리 구조로 데이터를 담으며 값에 따라 순서가 정해짐, 데이터를 담으면서 동시에 정렬하여 HashSet보다 성능상 느림
- LinkedHashSet : 해쉬테이블에 담으면서 저장된 순서에 따라 순서가 결정
- List의 단점은 데이터가 많은 경우 처리시간이 늘어납니다. 데이터 수정시 전체를 옮겨주어야하는 작업때문입니다.
- 데이터 저장시 HashSet와 LinkedHashSet의 성능은 비슷하고 TreeSet은 좋지 않습니다. 또한 미리 데이터 크기를 지정하는것이 조금 더 성능이 좋습니다.
- 데이터 순차적으로 읽을시 LinkedHashSet이 성능이 가장 좋고 HashSet, TreeSet 순입니다.
- 데이터를 랜덤으로 읽을시 HashSet과 LinkedHashSet의 속도는 비슷하고 TreeSet은 좋지 않습니다.
- TreeSet은 읽을시 성능이 좋지 않지만 데이터를 순서에 따라 탐색하는 작업에는 유용합니다.
List
- 배열의 확장판으로 저장할 개수를 모를때 사용하면 자동으로 크기가 증가 됨으로 유용합니다.
- Vector : 객체 생성시 크기를 지정할 필요가 없는 배열 클래스
- ArrayList : Vector와 비슷하지만 동기화가 되어있지 않음
- LinkedList : ArrayList와 비슷하지만 Queue 인터페이스를 구현
- 데이터를 넣을 때는 성능의 차이가 크게 없습니다.
- 데이터를 읽을때는 ArrayList가 가장 빠르고 Vector와 LinkedList는 느립니다. LikedList의 성능이 많이 안좋은데 Queue를 상속하고 있으므로 peek()메서드를 사용해야 성능이 좋습니다. Vector의 경우 동기화로 인해 성능이 느립니다.
- 데이터 삭제시 데이터를 옮겨주어야 하기 때문에 느립니다.
Map
- ID와 패스워드, 코드와 이름 등 고유한 값과 그 값을 설명하는 데이터를 보관할 때 유용합니다.
- Hashtable : 데이터를 해쉬 테이블에 담으면서 동기화가 필요할 때는 해당 클래스를 사용하는 것이 유용
- HashMap : 데이터를 해쉬 테이블에 담으면서 null 값을 허용하고 동기화가 되어있지 않음
- TreeMap : 트리 구조에 데이터를 담으면서 키에 의해 순서가 정해짐
- LinkedHashMap : HashMap과 거의 동일하며 이중 연결 리스트 방식을 이용하는 방식
- 데이터를 꺼낼때 다 비슷한 성능을 보여주며 TreeMap이 가장 좋지 않습니다.
일반적으로 많이 사용하는 컬렉션
- HashSet
- ArrayList
- HashMap
- LinkedList
최신버전에서 모든 컬렉션들은 동기화 되어있지 않고 동기화를 지원하는 메서드를 제공합니다.