Programming/Java

[Java] 자바 HashSet 사용 방법

psychoria 2021. 11. 20. 17:00
반응형

자바의 HashSet은 Set 인터페이스를 구현한 클래스입니다.

HashSet은 중복된 값을 허용하지 않으며 List 등과는 다르게 입력한 순서가 보장되지 않습니다.

HashSet의 특징을 정리하면 다음과 같습니다.

  1. 중복된 값을 허용하지 않음
  2. 입력한 순서가 보장되지 않음
  3. null을 값으로 허용

중복된 값을 허용하지 않는 특징이 있기 때문에 값의 존재 유무를 파악할 때 사용할 수 있습니다.

HashSet의 내부 코드를 보면 HashMap을 사용해서 구현이 되어 있는 것을 볼 수 있습니다.

자바의 HashSet을 활용하는 방법을 알아보겠습니다.

 

1. HashSet 생성

자바에서 HashSet을 사용하려면 아래 구문을 추가해야 합니다.

import java.util.HashSet;

HashSet을 생성하는 방법은 다음과 같습니다.

HashSet<String> colors1 = new HashSet<String>(); // 타입 지정
HashSet<String> colors2 = new HashSet<>(); // 타입 생략 가능
HashSet<String> colors3 = new HashSet<>(10); // 초기 용량(Capacity) 설정
HashSet<String> colors4 = new HashSet<>(colors1); // 다른 Collection값으로 초기화
HashSet<String> colors5 = new HashSet<>(Arrays.asList("Blue", "Black", "White")); // Arrays.asList()
HashSet<String> colors6 = new HashSet<>(){{
    add("Blue");
    add("Black");
    add("White");
}};

기본적으로 빈 HashSet을 생성할 때는 두 번째 방법을 주로 사용합니다.

그리고 원하는 값들을 추가하면서 생성하는 것도 가능합니다.

상황에 맞는 방법을 사용해서 HashSet을 생성하면 됩니다.

 

2. HashSet 엘레멘트 추가

HashSet에 값을 추가하고 싶을 때는 add() 메소드를 호출하면 됩니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> colors = new HashSet<>();
        colors.add("Black");
        colors.add("White");
        colors.add("Green");
        colors.add("Red");

        System.out.println(colors);
    }
}

HashSet은 입력된 순서가 보장되지 않기 때문에 특정 위치에 값을 추가하거나 할 수는 없습니다.

결과

출력된 값의 순서를 보면 입력한 순서와 상관없이 출력되는 것을 알 수 있습니다.

다른 컬렉션의 값들을 한 번에 입력할 때는 addAll()을 사용합니다.

import java.util.Arrays;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> colors = new HashSet<>();
        colors.add("Black");
        colors.add("White");
        colors.add("Green");

        HashSet<String> otherColors = new HashSet<>(Arrays.asList("Black", "Yellow", "Purple"));
        colors.addAll(otherColors);

        System.out.println(colors);
    }
}

값들을 입력할 때 중복되는 값은 제거가 되기 때문에 중복이 발생하지 않습니다.

결과

Black이 중복되지만 한 번만 표시되는 것을 확인할 수 있습니다.

 

3. HashSet 엘레멘트 삭제

HashSet에 추가된 값을 삭제할 때는 remove(), removeAll(), removeIf()를 호출하면 됩니다.

import java.util.Arrays;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> colors = new HashSet<>();
        colors.add("Black");
        colors.add("White");
        colors.add("Green");
        colors.add("Blue");
        colors.add("Red");
        colors.add("Purple");

        colors.remove("Red");
        System.out.println(colors); // [White, Blue, Purple, Black, Green]

        colors.removeIf(color -> color.startsWith("B"));
        System.out.println(colors); // [White, Purple, Green]

        colors.removeAll(Arrays.asList("White", "Green"));
        System.out.println(colors); // [Purple]

        colors.clear();
        System.out.println(colors); // []
    }
}

먼저, remove()는 특정 값을 삭제할 때 사용합니다.

그리고 조건을 적용해서 여러 값들을 삭제할 때는 removeIf() 메소드를 사용하면 됩니다.

예제의 코드는 B로 시작하는 색들을 지우는 코드입니다.

마지막으로 removeAll()은 다른 컬렉션에 있는 값들을 입력 값으로 받아서 해당 값들을 전부 찾아서 지웁니다.

remove()는 값이 지워지면 true를 리턴하기 때문에 삭제와 동시에 값이 존재했었는지 여부를 알 수 있습니다.

HashSet 안의 모든 값을 지우고 싶을 때는 clear() 메소드를 호출하면 됩니다.

 

4. HashSet 전체 값 확인

HashSet의 전체 값을 확인하는 방법은 잘 사용되는 방법은 아닙니다.

HashSet을 사용하는 이유는 컬렉션 내에 찾고자 하는 값이 존재하는지 여부를 확인하기 위해서입니다.

import java.util.HashSet;
import java.util.Iterator;

public class Main {
    public static void main(String[] args) {
        HashSet<String> colors = new HashSet<>();
        colors.add("Black");
        colors.add("White");
        colors.add("Green");
        colors.add("Red");

        // for-each loop
        for (String color : colors) {
            System.out.print(color + "  ");
        }
        System.out.println();

        // using iterator
        Iterator<String> iterator = colors.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "  ");
        }
        System.out.println();
    }
}

for를 사용하는 방법과 iterator를 사용하는 방법을 고려해 볼 수 있습니다.

 

5. 값 존재 유무 확인

HashSet은 컬렉션 내에 값이 존재하는지 여부를 확인하는데 최적화된 자료 구조입니다.

contains() 메소드를 호출해서 값이 존재하는지 여부를 빠르게 확인할 수 있습니다.

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<String> colors = new HashSet<>();
        colors.add("Black");
        colors.add("White");
        colors.add("Green");
        colors.add("Red");

        System.out.println(colors.contains("Green")); // true
        System.out.println(colors.contains("Purple")); // false
    }
}

값이 존재하는 경우 true를 리턴하며 없는 경우 false를 리턴합니다.

값이 존재하는지 유무를 파악하는 것이 중요하다면 HashSet을 적극 활용하면 됩니다.

반응형