Skip to main content

Command Palette

Search for a command to run...

[JAVA] HashSet

Updated
•2 min read•View as Markdown
[JAVA] HashSet
S

Nice to meet u :) Im Backend Developer

목표 : HashSet의 내부 동작 방식과 중복 제거 메커니즘, HashSet이 효율적인 중복 체크를 할 수 있는 이유 확인하기.

사진 출처 : 김영한의 JAVA 중급 과정

1️⃣HashSet ?

Set은 중복을 허용하지 않는다.

Hash는 (인덱스값=값) 인덱스만 찾으면 값을 찾을 수 있기 때문에 O(1)성능을 가진다. 하지만 9999숫자 데이터가 들어오면 9999개의 인덱스가 필요하다.메모리 낭비가 심하게 발생한다. 이를 해결하기 위해 HashIndex가 등장한다. 나머지 연산을 활용하여 인덱스값=나머지값 으로 설정한다. 이때 CAPACITY=10으로 설정하고 99,9가 들어오면 해시 충돌이 일어나는데 배열 안에 배열을 만들면 해결된다. 조회할때도 인덱스 안 배열만 비교하면 된다.(평균 O(1) 최악 O(n))


2️⃣ 중복 제거/체크 메커니즘

해시 코드는 해시 함수를 통해서 데이터를 대표하는 값을 나타낸다. (예 : A→65 ) 해시 인덱스는 해시 코드를 이용해서 데이터의 저장 위치를 결정한다. 따라서, 우리가 만든 객체 또한 해시 코드로 나타내어 해시 인덱스를 구할 수 있다.

public class Object{
    public int hashCode();
}

이 메서드는 객체의 참조값을 기반으로 해시 코드를 생성하기 때문에 인스턴스가 다르면 해시 코드도 다르다. 이를 재정의해서 사용하는데 equals()도 같이 재정의 해줘야한다. 해시 인덱스가 같아도 실제 저장된 데이터는 다를 수 있기 때문에 equals()로 확인하는 것이다.

public static void Main(String[] args){
    MyHashSet set=new MyHashSet(10);
    Member m1 = new Member("A");
    Member m2 = new Member("A");
    set.add(m1);
    set.add(m2);
}
  1. hashCode, equals 둘 다 재정의 안할 경우 : 객체 참조값을 기반(기본)으로 해시 코드를 생성하기 때문에 해시 코드가 실행마다 값이 달라진다.

  2. hashCode 재정의, equals 재정의 안할 경우 : hashCode를 재정의 했기 때문에 같은 해시 코드를 사용한다. 따라서 해시 인덱스가 같다. equals는 재정의 하지 않았기 때문에 Object의 equals를 사용한다. 이때는 인스턴스의 참조값을 비교한다.따라서 “A” 비교에 실패하여 같은 인덱스에 데이터가 중복으로 저장된다.

  3. hashCode, equals 모두 재정의 할 경우 : hashCode를 재정의 했기 때문에 같은 해시 코드를 사용한다. 따라서 해시 인덱스가 같다. equals 또한 재정의 했기 때문에 “A” 중복을 확인한다. 중복 데이터가 저장되지 않는다.

⚡ 정리

HashSet
해시 인덱스를 활용한 중복 데이터가 없는 Set

중복 제거/체크 메커니즘
hashCode(), equals()함수를 재정의하여 중복 제거, 체크

More from this blog

[Spring] N+1문제 발생과 분석

✍️ 작성하게 된 이유 옷을 관리하는 서비스를 개발하면서 Cloth 엔티티와 그에 연관된 ClothWithAttributes, Attribute 데이터를 함께 조회하는 기능이 필요했다.그런데 연관 데이터를 조회할 때마다 쿼리가 폭발적으로 증가(N+1 문제) 하며, 성능이 급격히 저하되는 상황을 마주하게 되었다. Spring JPA의 대표적인 문제로 N+1임을 알고있었지만, 해결하는 방법은 Fetch Join밖에 몰랐다. 지연로딩되는 필드를 엔티...

Sep 17, 20256 min read
[Spring] N+1문제 발생과 분석

데이터베이스 기본 개념 정리

1️⃣ 데이터베이스(DB) & DBMS DB (Database): 일정한 규칙(스키마)에 따라 구조화되어 저장된 데이터의 집합. DBMS (Database Management System): DB를 제어/관리하는 시스템 소프트웨어. 특징: 실시간 접근 가능, 동시 공유 가능. 구조: 데이터베이스 → DBMS → 응용 프로그램 → 사용자 2️⃣ 엔티티(Entity) & 릴레이션(Relation) 엔티티: 여러 속성을 가진 "개체"...

Aug 5, 20252 min read
데이터베이스 기본 개념 정리

[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

✍️ 작성하게 된 이유 무신사, 29cm는 Jsoup으로 충분히 크롤링이 가능했기 때문에, ZigZag도 당연히 Jsoup으로 처리될 것이라 생각했다. 무신사, 29cm와 마찬가지로 필요한 데이터는 모두 <script> 태그 안에 들어있었다. 하지만… 예상은 보기 좋게 빗나갔다. 🧪 현상 ✅ 로컬 크롤링 → 정상 작동 Jsoup으로 script 태그 내에서 대표 이미지와 상품명을 잘 추출 로컬 환경에서는 아무 문제 없이 작동 ❌ A...

Jul 30, 20253 min read
[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

✍️ 작성하게 된 이유 날씨에 따라 옷을 추천해주는 서비스를 만들면서, 사용자가 입력한 구매 링크에서 옷 정보( 대표이미지, 상품명 )를 불러오는 기능이 필요했다. 처음에 해당 페이지를 동적 페이지로 판단했고, 자연스럽게 Selenium을 도입했다. 하지만 이 결정이 과연 최선이었는지는 수많은 시행착오 끝에야 알 수 있었다. 🕸️ Selenium을 선택한 이유 동적 페이지는 Jsoup으로 크롤링이 어렵다는 인식으로 처음부터 Selenium을 ...

Jul 28, 20254 min read
[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

Soyulia's Blog

49 posts