HashSet

lgw2236·2022년 11월 29일
0

Java

목록 보기
3/8
post-thumbnail

주절주절

이번 회사 도메인에서 대규모 프로모션 진행을 위한 개발을 진행 하게 됐는데 프로모션 가입자가 생각보다 많을 수도 있어 한번에 20-30만건 이상의 프로모션 코드를 생성하는게 가능해야 했다..
골똘히 고민하다 회사 후배 친구가 HashSet이라는 아이디어를 떠올리게됐다... wow...

기존의 로직은 2중for문 으로 프로모션 코드를 list로 생성한 이후
중복체크 로직을 돌려서 최종 생성하는 것이였는데..
기능은 안정적으로 잘 돌아갔지만 퍼포먼스적으로
생성 프로모션 코드가 만건 이상일 때 너무 느렸다..
만건 기준 1분 30초가 걸렸고.. 10만건 이상 넘어가면 거의 6분~10분 언저리의 시간이 걸려서 이건 아니다 싶어 퍼포먼스를 높이기 위해
로직을 리펙토링 하기로 결심했다..

이때 중복체크와 생성을 동시에 하면서 퍼포먼스를 끌어올릴 수 있는 방법이 뭐가 있을까 고민하다
HashSet 으로 생성 코드를 담으면 해시 코드 비교를 자동으로 하기 때문에 중복체크가 됨과 동시에 생성 로직에서 Hashset으로
선언한 list에 생성 코드를 담기만 하면되니 이거다! 싶어서 바로 Hashset으로 세팅 후 로직을 돌려보니 말도 안되는 결과가 나왔다 ..
만건 기준 1분 30초가 걸리던 기존 로직에 비해 HashSet으로 바꾼 이후
10만건 기준 50초~1분10초 정도로 약 10배 이상의 퍼포먼스 상승 효과가 나온것이다...

정말 이거 보고 잠이 깼었다.. 진짜 이때의 성취감... 난리났었다 ..

그래서 이런 퍼포먼스적인 상향효과를 줬던 HashSet 에 대해 기록해보고자 한다.

HashSet이란?

HashSet은 Set 인터페이스의 구현 클래스로 Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있습니다. 또한 저장 순서가 일정하지 않습니다. 저장 순서를 유지해야 한다면 JDK 1.4부터 제공하는 LinkedHashSet 클래스를 사용하면 됩니다. Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데 HashSet의 경우 정렬을 해주지 않고 TreeSet의 경우 자동정렬을 해준다는 차이점이 있습니다. Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점에 있습니다.

HashSet: 중복제거과정

HashSet의 중복제거방식은 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해시 코드를 얻어낸 다음, 저장되어 있는 객체들의 해시 코드와 비교한 뒤 같은 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.

문자열을 예로 들면 문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 String객체는 동일한 객체로 간주되고 다른 문자열을 갖는 String객체는 다른 객체로 간주되는데, 그 이유는 String클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴 값을 같게, equals()의 리턴 값은 true를 반환합니다.

HashSet: 생성예시

HashSet set = new HashSet();

-HashSet 값 추가 : set.add(?);
-HashSet 값 제거 : set.remove(?);
-HashSet 모든값 제거: set.clear();
-HashSet 크기 구하기: set.size();
-HashSet 값 검색: set.contains(찾을값);

profile
어제보다 오늘 더

0개의 댓글