HashSet
자바의 컬렉션중 하나로, 중복된 값을 허용하지 않는 Set인터페이스를 구현하는 클래스이다.
기본적으로 추가는 add를 통해서 값을 추가한다. 중복된 값이 들어가면
내부에서 중복여부 확인후 set에 저장하지않는다.
아래는 hashset에 중복값을 넣은 후에 결과이다.
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(1);
hashSet.add(2);
hashSet.add(2);
System.out.println(hashSet);
}
}
//출력: [1, 2]
중복값을 제외하고 1,2만 출력되는것을 볼 수 있다.
HashSet이 내부적으로 중복값을 처리하는 과정
1. 해시함수: HashSet은 해시 함수를 사용하여 값을 해시 코드로 변환해준다.
2. 배열과 버킷: 배열의 인덱스는 해시 코드의 일부를 사용하여 결정된다. 각 배열의 위치에는
버킷이 있고, 각 버킷은 하나 이상의 값이 저장될 수 있다. 연결리스트 또는 트리구조를
생각하면 된다.
3. 값을 HashSet에 추가할때, 해당값의 해시코드를 계산하여 배열 위치를 찾는다.
그리고 그 위치의 버킷을 검사하는데 값이 이미 존재한다면 중복된 값으로
인식해서 추가하지 않는다.
※해시 충돌 해결: 버킷에는 하나 이상의 값이 저장이 되고 그렇다보니 서로 다른값이
같은 버킷에 저장되는 경우가 있다. 하지만 HashSet내부에는 연결리스트나 트리구조를 통해
이를 해결하기에 걱정하지않고 사용하면 된다.
HashSet 배열로 변경하는 방법
보통은 이제 중복된 값을 처리하고 나머지 중복되지않은 값만 저장하고자
HashSet을 배열로 바꾸는 일이 생긴다.
그럴때 이제 HashSet크기만큼의 배열을 만들어주고 값을 반복문을 돌려서 받으면된다.
아래 예시는 향상된 for문을 이용해서 HashSet의 값을 배열에 넣어주고있다.
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
//중복된 값을 제외한 값들만 배열에 저장하기
//1. hashset에 값들을 다 넣어준다.
HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
set.add(1);
set.add(2);
//2.중복된값이 제외한 hashset을 배열로 바꿔준다
int[] arr = new int[set.size()]; //set크기만큼의 정수형 배열을 만든다.
int index = 0;
for (int num : set) {
arr[index++] = num;
}
}
}
위 코드를 통해 배열 arr은 {1,2,3} 이 된다.
'자바(Java)' 카테고리의 다른 글
[자바]자바 상속, 다이나믹&더블 메소드 디스패치 (0) | 2023.08.21 |
---|---|
[자바] 자바 클래스 (0) | 2023.08.14 |
[자바] 자바 조건문과 반복문, JUnit 5 (0) | 2023.08.05 |
[자바] 자바 연산자 (0) | 2023.07.29 |
[자바] 자바의 프리미티브 타입, 변수, 배열 선언 (0) | 2023.07.24 |