Java – Collection – Set

> Set (Interface)

  Set 은 중복 Element를 허용하지 않는 Collection의 종류이다.  또한 Set을 구현한 자료형들은 서로 equals와 hashCode를 이용하여 비교할 수 있게 엄격한 조건을 가지고 있다.  동일한 Element를 가지고 있는 Set의 두 구현체들은 서로 구현방법이 달라도 equals를 만족한다.  (이는 결국 동일한 객체만 중복으로 보지 않는다는걸 의미하기도 한다.)

 

> HashSet

  HashSet은 일반적으로 알고 있는 HashTable의 구조를 가진다.  내부적으로는 사실 HashMap을 기반으로 구현되어 있다.  Key-Value로 구성된 HashMap 에서 Key만을 사용하는 것으로 볼 수 있다.   Value는 불변객체를 이용해 Dummy값으로 설정한다.  또한 HashMap의 특징 처럼 Element가 추가된 순서 혹은, 특정 순서와 관계 없이 순회가 이루어진다. (Ordering 보장하지 않는다.)  또한 Null요소를 허용한다.  (중복 불허용이니, 결국 1개의 Null)
   Hash함수가 버킷간에 Element를 적절히 분산 시킨다는 가정하에 기본 작업 (add, remove, contains, size)에 일정한 시간 성능을 제공한다 .  iterator를 이용해 핸들링하려면, HashSet 인스턴스의 사이즈 (Element 수)와, 초기 HashSet 생성자의 (capacity)를 설정한 경우 잔여 공간의 합계에 비례 한 시간이 필요하다.  따라서 iterator 이용할 때 성능이 중요 할 경우 초기 용량을 알맞게 설정하는 것이 중요하다.

  HashSet은 기본적으로 non-thread safe하다. (동기화를 보장하지 않는다.)  복수의 thread가 동시에 HashSet를 이용하려면 외부적으로 동기화를 구현하거나,  Collections.synchronizedSet 메소드를 사용하여 Wrapping 하여 사용하여야 한다.

Set s = Collections.synchronizedSet (new HashSet (…));

 

> TreeSet

  NavigableSet 인터페이스의 구현체인 TreeSet은 실제 구현 Source를 보면 버킷(Element를 담는 공간)으로 TreeMap을 이용한다.  Element는 Natural Order (객체별 기본 Comparable 인터페이스 구현에 의한 compareTo 결과)로 정렬되거나 생성자에 부여된 Comparator에 의한 순서로 정렬 된다.

TreeSet의 버킷으로 이용되는 TreeMap은 Self-balancing Binary Search Tree의 종 류중 하나인 Red-black Tree 방식으로 내부 Element를 구조화 한다.

동기화 관련해서는 HashSet과 같은 특징을 가진다.

 

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *