HOME > java > collections > hashset

Java - HashSet 사용 방법 및 예제

By JS | 16 Oct 2019

Set는 List와 다르게 순서가 보장되지 않는 자료구조입니다.

HashSet는 다음과 같은 특징이 있습니다.

  • 중복된 값을 허용하지 않습니다.
  • 순서를 보장하지 않습니다.
  • null 값을 저장할 수 있습니다.
  • 내부적으로 HashMap을 사용하여 데이터를 저장합니다.

HashSet은 다음과 같은 메소드를 지원합니다. 각각의 메소드를 어떻게 사용하는지 예제와 함께 알아보겠습니다.

add()

HashSet<Type>으로 HashSet을 생성할 수 있습니다.

add() 메소드는 인자를 저장하고, 객체를 저장할 때 객체가 Set에 저장되어있지 않았다면 True를 리턴합니다. 이미 저장되어있다면 False를 리턴합니다.

public boolean add(E e)

다음은 HashSet을 생성하고 3개의 String 객체를 add하는 코드입니다. HashSet은 순서를 보장하지 않기 때문에 출력해보면 입력한 순서와 다르게 출력이 됩니다.

Set<String> fruits = new HashSet<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");
System.out.println("fruits: " + fruits);

// fruits: [banana, apple, kiwi]

실행 결과는 코드 바로 밑에 주석으로 붙여넣었습니다.

remove()

remove()는 인자로 전달된 객체를 Set에서 삭제합니다. Set에 객체가 존재하여 삭제가 되었다면 True를 리턴합니다. Set에 파일이 존재하지 않았다면 False를 리턴합니다.

public boolean remove(Object o)

다음은 HashSet에서 객체를 삭제하고 결과를 출력하는 코드입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");
System.out.println("fruits: " + fruits);

fruits.remove("apple");
System.out.println("fruits: " + fruits);

// fruits: [banana, apple, kiwi]
// fruits: [banana, kiwi]

removeAll()

removeAll()은 인자로 받은 Collection에 저장된 아이템들을 HashSet에서 삭제합니다.

boolean removeAll(Collection<?> c)

다음 코드는 removeAll을 이용하여 ArrayList에 저장된 객체를 HashSet에서 삭제하는 예제입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");
System.out.println("fruits: " + fruits);

List<String> removed = new ArrayList<>();
removed.add("apple");
removed.add("kiwi");

fruits.removeAll(removed);
System.out.println("fruits: " + fruits);

// fruits: [banana, apple, kiwi]
// fruits: [banana]

removeIf()

removeIf()는 인자로 람다식을 받을 수 있습니다. 함수형 인터페이스로 만들어진 객체를 받는다고 할 수 있습니다. Set의 아이템 중에 이 조건에 충족하는 객체는 삭제됩니다.

public boolean removeIf(Predicate<? super E> filter)

다음은 스트링의 길이가 4보다 큰 아이템을 삭제하는 예제입니다.

// fruits: [banana, apple, kiwi]
// fruits: [kiwi]

clear()

clear()는 HashSet의 모든 아이템들을 삭제합니다.

public void clear()

다음은 clear()를 사용하는 예제입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");
System.out.println("fruits: " + fruits);

fruits.clear();
System.out.println("fruits: " + fruits);

// fruits: [banana, apple, kiwi]
// fruits: []

contains()

contains()는 Set 안에 객체가 존재하는지 여부를 리턴해줍니다.

public boolean contains(Object o)

다음은 contains로 HashSet 내의 객체가 존재하는지 확인하는 코드입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");

System.out.println("has apple? " + fruits.contains("apple"));
System.out.println("has grape? " + fruits.contains("grape"));

// has apple? true
// has grape? false

iterator()

iterator()는 Iterator 객체를 리턴해 줍니다. 이 객체로 Set의 모든 아이템을 순회할 수 있습니다.

public Iterator<E> iterator()

다음은 HashSet의 모든 객체를 순회하면서 출력하는 코드입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");

Iterator<String> it = fruits.iterator();
while (it.hasNext())
    System.out.println("fruits: " + it.next());

// fruits: banana
// fruits: apple
// fruits: kiwi

for를 이용하여 아이템 접근

for문을 사용하여 Set의 모든 아이템에 접근할 수도 있습니다. iterator보다 for가 좀 더 간단해보입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");

for (String fruit : fruits) {
    System.out.println("fruits: " + fruit);
}

// fruits: banana
// fruits: apple
// fruits: kiwi
``


## isEmpty()
`isEmpty()`는 Set에 저장된 아이템이 없으면 True를 리턴해 줍니다.
```java
public boolean isEmpty()

다음은 isEmpty()를 사용하는 예제입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");
System.out.println("is empty? " + fruits.isEmpty());
fruits.clear();
System.out.println("is empty? " + fruits.isEmpty());

// is empty? false
// is empty? true

size()

size()는 HashSet에 저장된 아이템 개수를 리턴합니다.

public int size()

다음은 size()를 사용하는 예제입니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
System.out.println("size? " + fruits.size());
fruits.add("banana");
fruits.add("kiwi");
System.out.println("size? " + fruits.size());

// size? 1
// size? 3

중복된 값과 null 저장

Set는 null 저장을 허용하지만, 중복된 값은 허용하지 않습니다.

다음 코드의 결과를 보면 null은 저장되지만, 중복된 값은 1개만 저장됩니다.

Set<String> fruits = new HashSet<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("kiwi");
fruits.add(null);
fruits.add("kiwi");
System.out.println("fruits: " + fruits);

// fruits: [banana, null, apple, kiwi]

참고