(8) HashSet
1. HashSet의 기본 개념
- Set 인터페이스를 구현한 가장 대표적인 컬렉션이며, 기본적으로 중복된 요소를 저장하지 않고 저장순서
또한 유지하지 않는다.
- 만약 중복된 요소를 추가한다면, false를 반환하게 된다.
- 만약 저장순서를 유지하고 싶다면, LinkedHashSet을 사용한다.
- HashSet 메서드의 상세한 내용은 자바의 정석 631p를 참고한다.
1-1. HashSet을 이해하기 위한 예제(1)
: HashSet의 중복을 확인하는 예제이다.
1-2. HashSet을 이해하기 위한 예제(2)
: 6자리 로또 번호 랜덤 생성하는 예제이다.
1-3. HashSet을 이해하기 위한 예제(3)
: 6자리 로또 번호 랜덤 생성하는 예제이다.
( 정렬 기준은 set에 저장된 Integer 클래스에 정의된 것을 사용한다. )
1-4. HashSet을 이해하기 위한 예제(4)
: 5x5의 빙고판을 만드는 예제이다.
( 위 코드를 몇번 실행하다보면 계속 똑같은 숫자가 비슷한 위치에 있는 것을 볼 수 있는데, Set 특성상
저장 순서가 보장되지 않고 자체 방식의 저장 순서를 유지하기 때문이다. )
( 그래서 LinkedList를 사용한다. )
1-5. HashSet을 이해하기 위한 예제(5)
: Set에 중복된 객체를 저장하고 중복되는지 확인한 후, 중복이 확인될 수 있게 코드를 수정하는 예제이다.
( Dav,1의 객체를 중복 추가했음에도 불구하고 똑같은 객체가 중복되었다. )
( 이러한 것을 막기 위해서는 프로그래머는 eqauls()와 hashCode()를 호출하여 목적에 맞게 오버라이딩이 필요하다. )
( 아래의 코드처럼 Person 클래스에서 오버라이딩이 필요하다. )
( 추가적으로 hashCode() 메서드를 오버라이딩할 때 아래의 세 가지 규칙을 지키면서 코딩해야 한다. )
(1) 동일한 객체에 대해서 여러 번 hashCode()를 호출해도 동일한 int 값을 반환해야 한다.
( 실행 시 마다, 동일한 값에 대해 다 다를 수 있음. )
(2) equals() 메서드를 이용한 비교에 의해서 true를 얻은 두 객체는 각각 hashCode() 호출를 통한 값은
반드시 같아야 한다.
(3) equals() 메서드를 이용한 비교에 의해서 false를 얻은 두 객체는 각각 hashCode() 호출를 통한 값은
같을 수도 있지만, 되도록이면 해싱을 사용하는 컬렉션의 성능을 향상시키기 위해서는 다른 int 값을
반환하는 것이 좋다.
( 만약 중복된 것이 많다면, 컬렉션의 검색속도가 저하된다. )
1-6. HashSet을 이해하기 위한 예제(6)
: addAll, retainAll, removeAll을 구현하는 예제이다.
( 사실 교집합은 retainAll, 합집합은 addAll, 차집합은 removeAll만 써서 구현해도 된다. )