Java - HashSet

백종석·2022년 5월 16일
0

Java의 정석

목록 보기
1/2
post-thumbnail

HashSet은?

  • Set인터페이스를 구현한 가장 대표적인 컬렉션
  • Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.

HashSet에 새로운 요소를 추가할 때는?

  • add메서드addAll메서드를 사용하는데
  • 만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면
    • 이 메서드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다.

이러한 HashSet의 특징을 이용하면

  • 컬렉션 내의 중복 요소들을 쉽게 제거할 수 있다.
  • ArratList와 같이 List인터페이스를 구현한 컬렉션과 달리 HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면LinkedHashSet을 사용해야 한다
생성자 또는 메서드 설명
HashSet() HashSet 객체를 생성한다
HashSet(Collection c) 주어진 컬렉션을 포함하는 HashSet 객체를 생성한다
HashSet(int initialCapacity) 주어진 값을 초기용량으로 하는 HashSet 객체를 생성한다
HashSet(int initialCapacity, float loadFactor) 초기용량과 load factor를 지정하는 생성자
boolean add(Object o) 새로운 객체를 저장한다
boolean addAll(Collection c) 주어진 컬렉션에 저장된 모든 객체들을 추가한다 (합집합)
void clear() 저장된 모든 객체를 삭제한다.
Object clone() HashSet을 복제해서 반환한다 (얕은 복사)
boolean contaions(Object o) 지정된 객체를 포함하고 있는지 알려준다
boolean contaionsAll(Collection c) 주어진 컬렉션에 저장된 모든 객체들을 포함하고 있는지 알려준다
boolean isEmpty() HashSet이 비어있는지 알려준다
Iterator iterator() Iterator를 반환한다
boolean remove(Object o) 지정된 객체를 HashSet에서 삭제한다 (성공하면 true, 실패하면 false)
boolean removeAll(Collection c) 주어진 컬렉션에 저장된 모든 객체와 동일한 것들을 HashSet에서 모두 삭제한다 (차집합)
boolean retainAll(Collection c) 주어진 컬렉션에 저장된 객체와 동일한 것만 남기고 삭제한다 (교집합)
int size() 저장된 객체의 개수를 반환한다
Object[] toArray() 저장된 객체들을 객체배열의 형태로 반환하다
Object[] toArray(Object[] a) 저장된 객체들을 주어진 객체배열 (a)에 담는다

Set을 구현한 컬렉션 클래스는

  • List를 구현한 컬렉션 클래스와 달리 순서를 유지하지 않기 때문에 저장한 순서와 다를 수 있다.

만일 중복을 제거하는 동시에 저장한 순서를 유지하고자 한다면

  • HashSet대신 LinkedHashSet을 사용해야한다.

HashSet의 add메서드는

  • 새로운 요소를 추가하기 전에 기존에 저장된 요소와 같은 것인지 판별하기 위해
    • 추가하려는 요소의 equals()hashCode()를 호출하기 때문에 목적에 맞게 오버라이딩해야 한다.

오버라이딩을 통해 작성된 hashCode()는

  • 다음 세가지 조건을 만족 시켜야 한다.
    1. 실행 중인 애플리케이션 내의 동일한 객체에 대해서 여러 번 hashCode()를 호출해도 동일한 int값을 반환해야한다. 하지만, 실행시마다 동일한 int값을 반환할 필요난 없다. (단, equals메서드의 구현에 사용된 멤버변수의 값이 바뀌지 않았다고 가정한다.)
    2. equals메서드를 이용한 비교에 의해서 true를 얻은 두 객체에 대해 각각 hashCode()를 호출해서 얻은 결과는 반드시 같아야 한다.
    3. equals메서드를 호출했을 때 false를 반환하는 두 객체는 hashCode() 호출에 대해 같은 int값을 반환하는 경우가 있어도 괜찮지만, 해싱(hashing)을 사용하는 컬렉션의 성능을 향상시키기 위해서는 다른 int값을 반환하는 것이 좋다.
profile
항해중인 우당탕탕 코린이

0개의 댓글