(8) HashSet

2022. 1. 17. 15:07·자바/컬렉션 프레임워크

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만 써서 구현해도 된다. )

 

'자바 > 컬렉션 프레임워크' 카테고리의 다른 글

(10) HashMap과 Hashtable  (0) 2022.02.03
(9) TreeSet  (0) 2022.01.18
(7) Comparator와 Comparable  (0) 2022.01.17
(6) Arrays  (0) 2022.01.17
(5) Iterator, ListIterator, Enumeration  (0) 2022.01.15
'자바/컬렉션 프레임워크' 카테고리의 다른 글
  • (10) HashMap과 Hashtable
  • (9) TreeSet
  • (7) Comparator와 Comparable
  • (6) Arrays
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      불안정 정렬
      코딩트리조별과제
      소켓 프로그래밍
      snail
      중간연산
      알고스팟
      java.lang패키지
      코드트리
      문자 기반 스트림
      다형성
      안정 정렬
      TCP 소켓 프로그래밍
      자바 개념
      file
      안드로이드 스튜디오
      serializable
      역직렬화
      InputStream
      스트림
      Arrays
      java.time 패키지
      Collections Framework
      map()
      유용한 클래스
      제자리 정렬
      코딩테스트
      선택 정렬
      람다식
      ServerSocket
      outputstream
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    (8) HashSet
    상단으로

    티스토리툴바