해당 포스트는 "자바 성능 튜닝 이야기" 책의 내용을 요약한 것이다.
※ Set 인터페이스
: 중복을 허용하지 않는 집합을 처리하기 위한 인터페이스
- HashSet : 데이터를 해쉬 테이블에 담는 클래스로 순서 없이 저장된다.
- TreeSet : red-black 트리에 데이터를 담으면서 값에 따라 정렬을 해 순서가 정해진다. 따라서 HashSet 보다 성능상 느리다.
*red-black tree : 이진 탐색 트리에서 양쪽의 균형을 맞추는 기능을 추가한 트리이다. 트리의 한 쪽으로 균형이 쏠릴 경우 트리의 성능이 떨어지는 것을 방지한다.
1. LinkedHashSet : 저장된 순서에 따라 해쉬 테이블에 데이터를 담는다.
2. Set.add(data)를 통해서 데이터를 넣을 때
: HashSet과 LinkedHashSet의 성능은 비슷하고, TreeSet은 정렬을 해야 되서 TreeSet의 성능이 더 안 좋다. 만약 Set 객체에 담을 데이터의 갯수를 알고 있다면, 예를 들어 HastSet set = new HashSet<String>(COUNT); 라면 성능상 큰 차이는 발생하지 않으나 데이터의 크기를 알 경우 성능상 더 유리하다.
3. Set.iterator을 통해 데이터를 읽거나 Set 객체 안에 있는 임의의 데이터가 존재하는 지 확인할 때
: HashSet과 LinkedHashSet의 속도는 빠르지만, TreeSet은 느리다.
- 느린 TreeSet을 만든 이유?
: TreeSet은 다른 Set 콜렉션보다 느리다. 이렇게 느린 TreeSet을 만든 이유는 데이터를 저장하면서 정렬하기 때문이다. TreeSet은 NavigableSet<E> 인터페이스를 구현한다. 해당 인터페이스는 특정 값보다 큰 값, 작은 값, 가장 큰 값 등을 추출하는 메서드가 있다. 즉, 데이터를 순서에 따라 탐색하는 작업이 필요할 때 사용하면 좋다.
*Set 콜렉션에서는 데이터를 순서에 따라 탐색하는 작업을 하면 TreeSet을 사용하되, 그렇지 않으면 HashSet이나 LinkedHashSet을 사용해라.
※ List 인터페이스
※ Map 인터페이스
※ Collection 클래스의 동기화
: Vector와 Hashtable을 제외한 클래스들은 동기화되지 않은 클래스이다. 이들 클래스에 대해 동기화를 지원할 수 있는다. 방법은 synchronized로 시작하는 synchronizedSet/List/Map 메서드를 사용하는 것이다. 다음과 같다.
Set s = Collections.synchronizedSet(new HashSet(...)); SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...)); Set s = Collections.synchronizedSet(new LinkedHashSet(...)); List list = Collections.synchronizedLsit(new Array(또는 Linked)List(...)); Map m = Collections.synchronizedMap(new Hash(Tree/LinkedHash)Map(...));
위 synchronized 처리한 클래스들은 Vector와 Hashtable보다 성능이 좋다. Map의 경우에 ConcurrenHashmap을 이용하면 synchronized 처리한 Hashmap 보다 더 나은 성능을 낼 수 있다.
'자바 > 자바 성능' 카테고리의 다른 글
생성자 대신 정적 팩터리 메서드를 사용할 수 있는지 고려해라 (0) | 2017.07.06 |
---|---|
스레드 기본 및 성능 (0) | 2017.07.05 |
static 성능 (0) | 2017.07.04 |
조건문, 반복문 성능 (0) | 2017.07.04 |
String, StringBuffer, StringBuilder (0) | 2017.07.03 |