HashSet이란?
HashSet은 Set 인터페이스를 구현한 클래스이며, 기초수학에서 집합과 같은 개념이다.
특이하게 합집합, 차집합, 교집합 등의 연산을 할 수 있다.
List와 차이점은 중복을 허용하지 않는다는 점과, 인덱스(index)로 데이터를 다루지 않는다는 점이 있다.
가장 중요한 것은 역시 중복을 허용하지 않는다는 점인것 같다.
HashSet 생성자
Set 인터페이스를 구현한 클래스이니 Set 형으로 선언해 줄 수 있다.
제네릭을 이용하여 데이터타입을 정의해주는 것이 좋다.
HashSet<Integer> set = new HashSet<>();
Set<String> set = new HashSet<>();
생성할 때 배열을 List로 변환하여 넣어주거나, List를 넣어서 생성할 수도 있다.
Set<Integer> setA = new HashSet<>(Arrays.asList(1,2,3,4,5));
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Set<Integer> setB = new HashSet<>(list);
Methods
add, remove, size, contains 등 기본적인 메소드들은 모두 지원한다.
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
System.out.println("set = " + set);//[1, 2, 3]
set.remove(1);
System.out.println("set = " + set);//[2, 3]
System.out.println("set.contains = " + set.contains(2));//true
System.out.println("set.size = " + set.size());//2
set.clear();
System.out.println("set.size after clear = " + set.size());//0
집합 연산
교집합, 합집합, 차집합 집합연산을 지원한다.
교집합
setA.retainAll(setB)
setA와 setB의 교집합 결과를 setA에 저장한다.
//교집합 : retainAll()
Set<Integer> setA = new HashSet<>(Arrays.asList(1,2,3,4,5));
Set<Integer> setB = new HashSet<>(Arrays.asList(2,4,6,8,10));
setA.retainAll(setB);
System.out.println("교집합 : setA = " + setA); //교집합 : setA = [2, 4]
합집합
setA.addAll(setB)
setA와 setB의 합집합 결과를 setA에 저장한다.
//합집합 : addAll()
Set<Integer> setC = new HashSet<>(Arrays.asList(1,2,3,4,5));
Set<Integer> setD = new HashSet<>(Arrays.asList(2,4,6,8,10));
setC.addAll(setD);
System.out.println("합집합 : setC = " + setC); //합집합 : setC = [1, 2, 3, 4, 5, 6, 8, 10]
차집합
setA.removeAll(setB)
setA와 setB의 차집합 결과를 setA에 저장한다.
//차집합 : removeAll()
HashSet<Integer> setE = new HashSet<>(Arrays.asList(1,2,3,4,5));
HashSet<Integer> setF = new HashSet<>(Arrays.asList(2,4,6,8,10));
setE.removeAll(setF);
System.out.println("차집합 : setE = " + setE);//차집합 : setE = [1, 3, 5]
TreeSet(정렬)
TreeSet은 HashSet과 마찬가지로 Set 인터페이스를 구현한 클래스이고, HashSet과 성질이 동일하다.
그러나 TreeSet은 HashSet과 다르게, 이진탐색트리(BinarySearch Tree)의 구조로 되어있어, 데이터를 넣을 때 자동으로 정렬된다.
따라서 TreeSet은 HashSet보다 데이터 추가, 삭제에는 시간이 조금 더 걸리지만 정렬되어 저장된다는 점 때문에 조회가 빠르다. TreeSet은 기본적으로 오름차순 정렬을 지원하지만, 생성자의 매개변수로 Comparator 클래스를 구현하여 넣어주면, 정렬 방법도 설정할 수 있다.
2023.06.18 - [자료구조_알고리즘] - [JAVA/자료구조] TreeSet : 정렬을 지원하는 Set
'자료구조_알고리즘 > 자료구조_Java' 카테고리의 다른 글
[JAVA/자료구조] 힙(Heap), 최소 힙(Min Heap), 최대 힙(Max Heap) (0) | 2023.06.11 |
---|---|
[JAVA/자료구조] 그래프(Graph)의 개념, 탐색, 구현 (2) | 2023.06.11 |
[JAVA/자료구조] 트리(Tree), 이진트리(Binary Tree) 란? (0) | 2023.06.08 |
[JAVA/자료구조] Map / HashMap / Hashtable (0) | 2023.06.06 |
[JAVA/자료구조] DEQUE 데크 (양방향 큐) (0) | 2023.06.06 |