HashSet
- HashSet은 Set 인터페이스의 구현 클래스이다. 그렇기에 Set의 성질을 그대로 상속 받는다.
- Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있고 저장 순서가 유지되지 않는다.
- 만약 요소의 저장 순서를 유지해야만 한다면 LinkedHashSet 클래스를 사용하면된다.
- HashSet과 TreeSet 차이점은
- HashSet의 경우 정렬을 해주지 않고
- TreeSet의 경우 자동 정렬을 해준다.
- Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점이다.
- 만약 한 편의점에서 오늘 방문한 손님의 총 숫자를 계산하고 싶을 경우도 있을것이다.
이럴 경우 오늘 하루동안 편의점을 여러 번 방문한 손님은 한 번으로 체크해주어야 정확한 손님의 숫자가 나올 것이다.
이럴때 Set이 유용하게 쓰인다. - 다른 예시, 게임에서 '닉네임'을 만든다거나 아이디를 생성할 때 '중복확인'을 눌러 중복된 닉네임 또는 아이디인지 확인하는 것이다. 이는 데이터가 정렬되어있을 필요도 없고, 빠르게 중복되는 값이지만 찾으면 되기 때문에 유용한 방법이 될 수 있다.
- Set은 위 그림과 같이 주머니 형태로 되어 있다. 비선형 구조이기에 순서가 없고 그렇기에 인덱스도 존재하지 않는다.
그래서 값을 추가하거나 삭제 할때는 추가 혹은 삭제하고자 하는 값이 Set 내부에 있는지 검색한 뒤 추가 나 삭제 해야 하므로 속도가 List 구조에 비해 느리다. - hash에 의해 데이터의 위치를 특정 시켜 해당 데이터를 빠르게 색인(seach)할 수 있게 만드는 것이다.
즉, Hash 기능과 Set 컬렉션이 합쳐진 것이 HashSet 이다. 그렇기 때문에 삽입, 삭제, 색인이 매우 빠른 컬렉션 중 하나이다.
중복을 걸러내는 과정
- HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서
해시코드를 얻어낸 다음 저장되어 있는 객체들의 해시 코드와 비교한 뒤
같은 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
HashSet 사용법
HashSet 선언
HashSet<Integer> set1 = new HashSet<Integer>(); //HashSet 생성
HashSet<Integer> set2 = new HashSet<>();//new에서 타입 파라미터 생략가능
HashSet<Integer> set3 = new HashSet<Integer>(set1);//set1의 모든 값을 가진 HashSet생성
HashSet<Integer> set4 = new HashSet<Integer>(10);// 초기 용량(capacity)지정
HashSet<Integer> set5 = new HashSet<Integer>(10,0.7f);//초기 capacity. load factor 지정
HashSet<Integer> set6 = new HashSet<Integer>(Arrays.asList(1,2,3));//초기값 지정
- HashSet도 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 늘리는데 Set은 한 칸씩 저장 공간을 늘리지 않고 저장 공간을 약 두배로 늘린다. ⇒ 여기서 과부하가 많이 발생
- 그렇기에 초기에 저장할 데이터 갯수를 알고 있다면 Set의 초기용량을 지정해주는것이 좋다
HashSet 값 추가
HashSet<Interger> set = new HashSet<Integer>(); //HashSet 생성
set.add(1);// 값추가
set.add(2);
set.add(3);
- HashSet의 add(value) 메소드를 사용하면 된다.
- 입력되는 값이 HashSet 내부에 존재하지 않는다면 그 값을 추가하고 true 반환하고
내부에 값이 존재하면 false 반환
HashSet 값 삭제
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet생성
set.remove(1); //값 1 제거
set.clear();//모든 값 제거
HashSet 크기 구하기
HashSet<Integer> set = new HashSet<Integer>(Array.asList(1,2,3)); //HashSet 생성
System.out.println(set.size()); //set 크기:3
HashSet 값 출력
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet 생성
System.out.println(set); //전체출력 [1,2,3]
Iterator iter = set.iterator(); //Iterator 사용
while(iter.hasNext()){ //값이 있으면 true 없으면 false
System.out.println(iter.next());
}
- Set 컬렉션은 그냥 print하게 되면 대괄호 [ ]로 묶어서 set의 전체 값이 출력된다.
- Set에는 인덱스로 객체를 가져오는 get(index) 메소드가 없다.
- 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.
HashSet 값 검색
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); //HashSet 생성
System.out.println(set.contains(1)); //set내부에 값 1이 있는지 check; true
출처
https://dev-coco.tistory.com/36
https://st-lab.tistory.com/142
'이론 > 자바' 카테고리의 다른 글
[Java] TreeMap (0) | 2024.09.04 |
---|---|
[Java] HashMap (2) | 2024.09.04 |
[Java]TreeSet (0) | 2024.09.04 |
[Java] 자바 컬렉션 프레임워크(List, Set, Map) (0) | 2024.09.04 |
클래스 (0) | 2023.12.27 |