CS 지식/JAVA
[Java] HashSet의 개념과 사용법
dev.ojin
2024. 3. 23. 19:17
Set의 개념
1. 객체 중복 저장할 수 없으며, 하나의 null 값만 저장 가능
2. 중복 자동 제거
3. 비선형 구조 -> 순서, 인덱스 개념 X -> 그로 인해 처리 속도가 List 구조에 비해 느리다는 단점 有
HashSet의 개념
1. HashSet은 Set 인터페이스에서 지원하는 구현 클래스
2. Set을 그대로 상속받는 것이 특징
3. 중복된 값을 허용하지 않음 -> 중복 제거, 값의 존재 여부 파악 관련 코딩테스트 문제 단골 해법
HashSet의 구현
- HashSet 생성
//타입(int, String 등등) 지정 가능 : 우항을 보세요
HashSet<int> nums1 = new HashSet<int>():
//타입 생략하여 사용 가능 -> 공백의 HashSet 생성시 사용
HashSet<int> nums2 = new HashSet<>();
//초기 용량 설정
HashSet<int> nums3 = new HashSet<>();
//nums1의 모든 값을 가진 HashSet 생성
HashSet<int> nums4 = new HashSet<>(nums1);
//초기값 지정 가능
HashSet<int> nums5 = new HashSet<>(Arrays.asList("000","123","456"));
//Q. 초기값을 왜 굳이 지정함??
//A. HashSet 컬렉션을 초기화하기 위해서..ㅎㅎ
//Q. 그런데 왜 여러개의 초기값을 저렇게까지 HashSet을 초기화하는거야?
//A. 초기값이 여러개라면, 코드도 그에 따라 여러 줄이 나올 텐데 저렇게 하면 코드도 간결하고, 효율적이니깐!
- HashSet 요소 값 추가 : add() 메소드
//생성된 Hash에 add() 메소드 호출하여 값 추가 가능 & 중복 걸러냄
HashSet<String> mygirls = new HashSet<>():
mygirls.add("florence pugh");
mygirls.add("michelle khan"); //양자경
mygirls.add("sydney sweeny");
mygirls.add("pham hanni");
//만일, 이때 입력되는 값이
//HashSet 내부에 이미 존재하고 있다면 false를 반환하고 (중복은 금물)
//HashSet 내부에 존재하지 않는다면 그 값은 HashSet에 추가하고 true를 반환함
- HashSet 크기 구하기 : size() 메소드
//HashSet의 크기는 size() 메소드를 사용해서 구할 수 있다
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));
//set 크기 : 3 반박시 나는솔로 출연 시켜서 수모 겪게 함
System.out.println(set.size());
//이러면 3이 출력됨
- HashSet 요소 값 삭제 : remove(value) 혹은 clear() 메소드
- 만약 삭제하려는 값이 HashSet 내부에 존재한다면, 그 값을 삭제하고 true를 반환
- 만약 삭제하려는 값이 HashSet 내부에 존재하지 않는다면, false를 반환
//remove(value)와 clear() 차이 : 값 지정하여 삭제 or 싹 다 지워
//remove(value) 메소드 활용하여 Hash값 제거해보기
//(value)안에는 지우려고 하는 값을 적으면 된다
HashSet<Integer> set = new HashSet<>(Arrays.asList(1,2,3));
set.remove(2); // 담겨진 3개의 값중에서 '2'라는 값 하나만 삭제
//clear() 메소드를 활용하여 Hash값 제거해보기
set.clear();
//순삭
- HashSet 요소 값 검색 : contains(value) 메소드
//원하는 값에 대해 contains(value) 메소드를 통해 Hash 내부에 존재하는 지 확인 가능
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));
//예제) set 안에서 값 1을 찾는 중
//set 내부에 원하는 값이 있다면, true 출력하고 없다면 false 출력
System.out.println(set.contains(1));
- HashSet 요소 값 출력
- Set 컬렉션을 그냥 syso 처리할 경우 : 대괄호 [] 로 묶여서 Set의 전체값이 줄줄이 소시지로 출력됨
- Set 컬렉션 안의 요소를 하나씩 꺼내고 싶다면, 한번씩 반복해서 가져오는 반복자 Iterator을 사용해야 함
HashSet<String> set_dinner = new HashSet<String>(Arrays.asList("뼈해장국","갈비탕","짬뽕","장수제비"));
//1-1. Set 컬렉션을 그냥 print 처리하는 경우 : 대괄호의 재림
System.out.println(set_dinner);
//출력 결과 : [뼈해장국, 갈비탕, 짬뽕, 장수제비]
//1-2. 전체 객체 set_dinner를 대상으로, 한번씩 반복해서 가져오는 경우 : Interator의 등장
Iterator iter = set_dinner.iterator(); //객체 set_dinner을 대상으로 반복자 선언해줌
//hasNext() : 가져올 객체가 있다면 true 리턴, 없으면 false 리턴
//next() : Iterator에서 하나의 객체를 가져올 수 있는 메소드.. 인형뽑기 기계에서 오직 인형 하나만 뽑을 수 있는 악력 허벌의 집게
while(iter.hasNext()) {
System.out.println(iter.next());
}