HashSet 내부 구현

2023. 10. 26. 21:04·Java

예전 국비학원 프로젝트 진행 시 랜덤추천 서비스 기능을 만든적이 있다.

그 당시 자바 스터디를 하고 있었고 컬렉션에 순서를 보장 하지 않는 Set을 구현 하면 되겠다 생각해 사용했는데

시간이 지나 HashSet은 완전한 랜덤값이 아니라는 것을 알게 된것을 정리하는 시간

 

HashSet의 내부를 까보면 HashMap이 있다. 

 

또 HashSet의 add메소드를 보면 map에 key에 객체를 넣고 value에 더미값(new Object)을 넣는다.

 

 

그 후에  key값을 hash메소드에 넣는다.

 

그 후 key를 해쉬코드로 변환해 h 에 저장 후 리턴한다.

 

hashCode는 각 객체를 고유한 정수의 값으로 반환 해준다.

 

HashSet과 HashMap은 hash값을 이용해 저장하고 관리한다.

 

저렇게 변환되어 저장되면 순서가 어떻게 될까 

 

버킷이라는것이 있다.

여기서 버킷은 배열의 크기라고 이해하면 된다.

 

HashMap을 기본적으로 선언하게 되면, 디폴트 버킷 사이즈가 16으로 지정이 되는데

hashCode를 버킷 수로 나눈 나머지를 배열의 index로 사용하게 된다.

 

결국 순서를 보장하지 않는건 맞지만 해쉬로 계산된 값에 의해 저장된다.

 

만약 순서를 보장하고 싶다면 LinkedHashMap/LinkedHashSet 을 사용하자

 

 

 

 

 

'Java' 카테고리의 다른 글

System.out.println 메소드는 현업에서 절대 쓰지 말아야 하는 이유  (4) 2023.11.28
equals와 hashCode  (2) 2023.11.06
String Builder 와 String Buffer  (1) 2023.10.31
'Java' 카테고리의 다른 글
  • System.out.println 메소드는 현업에서 절대 쓰지 말아야 하는 이유
  • equals와 hashCode
  • String Builder 와 String Buffer
유당불내증이 있는 개발자
유당불내증이 있는 개발자
  • 유당불내증이 있는 개발자
    보초개발
    유당불내증이 있는 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
      • Java
      • 이슈
      • 책
        • 객체지향의 사실과 오해
        • 자바의 신
        • 스프링 입문을 위한 자바 객체 지향의 원리와 이해
        • 토비의 스프링
        • 모던 자바 인 액션
        • 이펙티브 자바
        • Real MySQL 8.0
        • 자바 성능 튜닝이야기
        • 만들면서 배우는 클린 아키텍처
      • 인프런 강의
        • Practical Testing: 실용적인 테스트..
        • Jenkins를 이용한 CICD Pipeline ..
        • 비전공자도 이해할 수 있는 쿠버네티스 입문,실전
        • 대기업 근무하며 경험한 Redis를 야무지게 사용..
      • TIL
  • 인기 글

  • 태그

    redis
    AWS
    explain
    EC2
    db
    MySQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
유당불내증이 있는 개발자
HashSet 내부 구현
상단으로

티스토리툴바