Peony의 기록 창고 🌼
Published 2022. 8. 11. 23:26
[Java] HashSet 정의 & 주요 메서드 JAVA
반응형

HashSet이란?

HashSet은 Set 인터페이스에서 지원하는 구현 클래스이다. 그렇기 때문에 Set의 특징을 그대로 상속받는다.

Set은 Key의 중복을 허용하지 않고, 키로 null을 허용하지 않는다. 또한, 순서 없이 Key로만 데이터를 저장한다. 만약, 요소의 저장 순서를 유지해야 한다면 JDK1.4부터 제공하는 LinkedHashSet 클래스를 사용하면 된다.

Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점이다. 만약, 어떤 가게에서 오늘 방문한 손님의 총 숫자를 계산할 경우를 보자. 이럴 경우 오늘 하루 동안 가게를 여러 번 방문한 손님은 한 번으로 체크해주어야 정확한 손님의 숫자가 나올 것이다. 이럴 때 Set을 사용하면 된다.

 

Set은 비선형 구조이기 때문에 순서가 없고, 때문에 인덱스도 당연히 존재하지 않는다. 따라서 값을 추가하거나 삭제할 때는 그 값이 Set 내부에 있는지 검색을 한 뒤, 추가나 삭제를 해야 하므로 속도가 List 구조에 비해 느리다.

Set 인터페이스를 구현하는 클래스는 HashSet, TreeSet 등이 있다.

 

❓HashSet과 TreeSet의 차이점은 뭘까?

  • HashSet : 정렬 X
  • TreeSet : 자동정렬

 

HashSet 선언

HashSet<Integer> set = new HashSet<>();
HashSet<Integer> set1 = new HashSet<Integer>(set1);//set1의 모든 값을 가진 HashSet생성
HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));//초기값 지정

HashSet<Integer> set = new HashSet<Integer>(10);//초기 용량(capacity)지정
HashSet<Integer> set = new HashSet<Integer>(10, 0.7f);//초기 capacity,load factor지정

보통 HashSet<데이터타입> 변수명 = new HashSet<데이터타입>();으로 선언하면 된다.

 

HashSet 값 추가

HashSet<Integer> set = new HashSet<>(); //HashSet생성
set.add(1); //값 추가
set.add(2);

 

HashSet 값 삭제

remove(value) 메소드를 사용

set.remove(1);//값 1 제거

 

전부 삭제하고 싶은 경우, clear() 메소드 사용

set.clear();//모든 값 제거

 

HashSet 크기 구하기

size() 메소드 사용 (중복값이 들어오면 자동으로 제거한다.)

System.out.println(set.size()); //set 크기 출력

 

HashSet 값 출력하기

1. HashSet 데이터를 단순히 println으로 출력하는 경우, [1, 2] 형태로 출력된다.

System.out.println(set); //전체출력 [1,2]

 

 

2. 하나의 객체를 가져오고 싶은 경우

Set에는 인덱스가 없으므로 get(index) 메소드가 없다. 따라서 Iterator를 사용한다. Iterator는 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자이다. iterator() 메소드를 호출하면 얻을 수 있다. Iterator에서 하나의 객체를 가져올 때는 next() 메소드를 사용한다. next() 메소드를 사용하기 전에 먼저 가져올 객체가 있는지 확인하는 것이 좋다. hasNext() 메소드는 가져올 객체가 있으면 true를 리턴하고, 없으면 false를 리턴한다.

Iterator iter = set.iterator();    // Iterator 사용
while(iter.hasNext()) {//값이 있으면 true 없으면 false
    System.out.println(iter.next());
}

 

HashSet 값 검색

HashSet 내부에 원하는 값이 있는지 확인하고 싶다면 contains(value) 메소드를 사용하면 된다. 파라미터로 주어진 객체가 HashSet이 가지고 있다면 true, 아니면 false를 반환한다.

for(int num : set) {
  if(set.contains(num)) {
    System.out.println(num);
  }
}

 

Reference

https://coding-factory.tistory.com/554

 

반응형
profile

Peony의 기록 창고 🌼

@myeongju