목차
- Set 인터페이스
- HashSet이란?
- 사용법(생성자, 데이터의 개수, 비어있는 지 확인, 데이터 확인, 추가, 제거, 전체 데이터 조회)
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
'Language > Java' 카테고리의 다른 글
[Java][Collections Framework 완전 정복] Stack 클래스를 사용하지 않는 이유 및 대안 (0) | 2025.01.16 |
---|---|
[Java][Collections Framework 완전 정복] Map 인터페이스, Map.Entry 인터페이스 (0) | 2025.01.07 |
[Java][캐스팅] int[] <-> ArrayList (1) | 2025.01.07 |