오늘부터 java 의 Collection 을 뽀개보는 시간을 가져보겠다.
오늘의 주인공은 Set.
Set 이라는 interface 에, Set 의 구현체인 HashSet, TreeSet, LinkedHashSet 을 알아보고자 한다.
Set
- 중복을 허용하지 않는다. 어릴때 배웠던 집합처럼 중복된 요소를 인정하지 않기 때문에, 이미 set 에 존재하는 요소를 추가하려고 하면 무시된다.
- 순서 없습니다. 요소의 순서를 보장하지 않는다. HashSet 의 경우, 순서가 변경될 수 있다.
- Indexing 없다 : Array, List 와 다르게 인덱싱을 제공하지 않는다.
- Primitive type을 저장할 수 없다. : Set 은 ArrayList, Map 과 함꼐 wrapper class 만 저장할 수 있습니다. (Int, long, double 등은 저장할 수 없다.)
주요한 Set 의 인터페이스에는 HashSet, TreeSet, LinkedHashSet 가 있다.
TreeSet, LinkedHashSet 은 기본적으로 HashSet 과 사용법이 유사하므로, HashSet 으로 Set 의 method 사용법을 대체한다.
HashSet
- 순서가 보장되지 않는다.
- Hash 테이블 구조를 사용하여 요소를 저장하므로 요소에 대한 빠른 액세스 시간을 제공한다.
메서드 정리
add()
: 원소를 추가한다.
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<String> cars = new HashSet<String>();
cars.add("Volvo");
cars.add("Toyota");
cars.add("Mazda");
}
}
remove()
: 특정 원소를 제거한다.
cars.remove("Volvo);
contains()
: 포함 여부 확인
cars.contains("Volvo"); // false
TreeSet
- 중복이 허용되지 않는다.
- 입력 순서에 따라 순서를 보장하지 않는다.
- 원소는 오름차순에 따라 원소를 저장한다.
- Thread-safe 하지 않다.
import java.util.Set;
import java.util.TreeSet;
public class TestTreeSet {
public static void main(String[] args) {
Set<String> treeSet = new TreeSet<>();
treeSet.add("zebra");
treeSet.add("kangaroo");
treeSet.add("ant");
for (String s : treeSet) {
System.out.println(s);
}
}
}
// 실행결과(알파벳 오름차순으로 출력된다.)
// ant
// kangaroo
// zebra
LinkedHashSet
- 입력 순서를 지킨다.
- HashSet 의 자손 객체다.
- TreeSet 보다는 복잡성이 떨어진다.
public class TestLinkedHashSet { public static void main(String[] args) { Set<Integer> intSet = new LinkedHashSet<>(); intSet.add(5); intSet.add(4); intSet.add(3); intSet.add(2); intSet.add(1); // Iterator 생성 Iterator<Integer> it = intSet.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } // 출력 // 5 // 4 // 3 // 2 // 1
참고 자료
https://www.baeldung.com/java-linkedhashset
https://www.geeksforgeeks.org/hashset-vs-treeset-in-java/
https://www.w3schools.com/java/java_hashset.asp
댓글