본문 바로가기

Language/Java

[Java][Collections Framework 완전 정복] Set 인터페이스(HashSet)

목차

  1. Set 인터페이스
  2. HashSet이란?
  3. 사용법(생성자, 데이터의 개수, 비어있는 지 확인, 데이터 확인, 추가, 제거, 전체 데이터 조회)

 

 

Set 인터페이스

먼저 HashSet을 알기 전에 Set부터 알아야한다.

 

 

Set의 특징

1. 객체를 중복해서 저장할 수 없다.

만약 중복한 값이 들어오면 자동으로 제거한다.

 

2. key, value형태를 지원하지 않는다.

이건 Map을 사용해야 한다.

 

3. 오직 하나의 null값만 저장할 수 있다.

 

Set의 메서드

Set은 Collections를 구현하는 만큼 그 메서드를 모두 사용가능하다.

 


 

그렇다면 HashSet이란?

Set을 구현한 클래스로 HashMap을 활용한 hash table로 구현된 객체이다.

Set 인터페이스의 구현체이니만큼 Set의 특성을 모두 가지고 있다.

 

추가적으로 순서를 보장하지 않는다.

 

 

그리고 이 구현체는 동기화를 지원하지 않으므로 멀티 쓰레드 환경일경우 외부에서 추가적인 처리가 필요하다.

Set s = Collections.synchronizedSet(new HashSet(...));

 

아니면 ConcurrentHashMap등의 사용을 고려하자.

 

 

사용법

1. 생성자

public HashSet()
/*
빈 HashSet을 생성한다.
기본값으로 capacity: 16, load factor: 0.75를 가진다.
*/
HashSet<String> set1 = new HashSet<>();


public HashSet(Collection<? extends E> c)
/*
특정한 컬랙션을 요소로 가지는 HashSet을 생성한다.
load factor는 기본값으로 0.75를 가진다.
예외: 만약 c가 null일 경우 NullPointerException을 예외로 던진다.
*/
HashSet<String> set2 = new HashSet<>(set1);
HashSet<String> set3 = new HashSet<>(Arrays.asList("a", "b", "c"));


public HashSet(int initialCapcity, float loadFactor)
/*
초기 용량과 용량을 늘리는 기준을 정한 HashSet을 생성한다.
자세한 설명은 아래에 추가해뒀다.
예외: 만약 initialCapacity가 0보다 작을경우 or loadFactor가 양의 값이 아니면 
IllegalArgumentException을 던진다.
*/
HashSet<String> set4 = new HashSet<>(100, 0.6);


public HashSet(int initialCapcity)
/*
초기 용량을 정한 HashSet을 생성한다. load factor는 기본값으로 0.75를 설정한다.
예외: 만약 initialCapacity가 0보다 작을경우 IllegalArgumentException을 던진다.
*/
HashSet<String> set5 = new HashSet<>(100);
load factor: capacity의 용량을 늘리는 기준
ex) capacity: 100, load factor: 0.6이면
60개의 요소가 collection에 들어오면 capacity를 100에서 두 배로 늘려 200이 된다.

capacity는 요소가 들어올수록 계속해서 늘어나는 값으로  
개발자는 initialCapacity만 설정이 가능하다는 점을 인지하자!

 

 

2. 요소의 개수

size() 메소드를 통해 들어있는 요소의 개수를 확인할 수 있다.

 

 

3. 비어있는지 확인

isEmpty() 메소드를 통해 비어있는 지 확인할 수 있다.

만약 비어있으면 true를,

비어있지 않을경우 false를 리턴한다.

 

 

4. 특정 요소 확인

contains(Object o) 메소드를 통해 특정 요소가 존재하는지 확인할 수 있다.

만약 있다면 true를,

없다면 false를 리턴한다.

 

 

5. 특정 값 추가

add(E e) 메소드를 통해 값을 추가할 수 있다.

HashSet은 순서를 보장하지 않기 때문에 특정 위치에 값을 추가할 수는 없다.

HashSet<Integer> numSet = new HashSet<>();
numSet.add(1);
numSet.add(2);
numSet.add(3);

 

 

6. 특정 값 삭제

remove(Object o)를 통해 특정 값에 대해 삭제가 가능하다.

이때 그 값에 대해 삭제가 가능한것이지, 위치로는 삭제할 수는 없다.

HashSet<Integer> numSet = new HashSet<>();
numSet.add(1);
numSet.add(5);
numSet.add(7);

numSet.remove(5);

 

 

 

7. 전체 값 삭제

HashSet<Integer> numSet = new HashSet<>();
numSet.add(1);
numSet.add(2);
numSet.add(3);

numSet.clear();

 

 

 

8. 데이터 전체 조회

Iterator를 사용하거나 향상된 for문을 통해 가능하다.

HashSet<Integer> numSet = new HashSet<>();
numSet.add(1);
numSet.add(5);
numSet.add(8);

// 향상된 for 문을 통해서 쉽게 접근할 수 있다.
for(Integer num : set){
	System.out.println("num : "+ num);
}
        
// Iterator 를 통해서 값을 가져올 수 있다.
Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
	Integer num = iter.next();
	System.out.println("num : "+ num);
}

 

 

출처

https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

https://velog.io/@acacia__u/hashSet

https://eno1993.tistory.com/125