Java 자료구조 - Set(HashSet)

Yuri Lee·2020년 12월 8일
0

Set(HashSet)

Set은 List와 달리 순서를 신경쓰지 않는다. 데이터가 존재하냐 안하냐만이 중요하다. 어떤 웹 사이트에서 하루에 접속하는 사람들 수를 구하고자 한다. 접속하는 IP를 세면 될 것이다. 근데 한사람이 여러번 접속하면 한 IP가 여러번 찍힐 것, 이건 한번으로 카운트 해줘야 제대로 된 접속자 수를 구할 수 있다. 이럴 때 쓰는게 Set이다.

Set(HashSet) 주요 클래스

Set 인터페이스를 구현한 주요 클래스는 3개가 있다.

  • HashSet : 순서가 필요없는 데이터를 hash table에 저장. Set 중에 가장 성능이 좋음
  • TreeSet : 저장된 데이터의 값에 따라 정렬됨. red-black tree 타입으로 값이 저장. HashSet보다 성능이 느림
  • LinkedHashSet : 연결된 목록 타입으로 구현된 hash table에 데이터 저장. 저장된 순서에 따라 값이 정렬. 셋 중 가장 느림

3개의 클래스가 성능 차이가 나는 이유는 데이터 정렬 때문이다. HashSet은 별도의 정렬 작업이 없어 제일 빠르다. 하지만 수백만 건의 데이터를 처리하는게 아니면 크게 체감하기는 힘들다고 한다.

HashSet

  • HashSet의 상속관계

AbstractCollection을 확장한 건 ArrayList와 같지만, HashSet은 AbstractSet을 확장헸다. AbstractSet 문서에 들어가보면 구현되어 있는 메소드는 equals(), hashCode(), removeAll() 3개 뿐이다. Set은 순서가 필요없고, 중복을 허용하지 않으므로 중복을 체크하는 equals()와 hashCode()는 필수

  • HashSet의 생성자

총 4개의 생성자가 있디. 여기서 load factor라는 용어가 나온다.

HashSet() 생성자의 설명을 보면 HashMap() 객체를 쓰는데 초기 저장용량(initial capacity)가 16이고 load factor는 0.75라고 되어있다. 간단히 설명하자면

저장된 element의 수 == 저장용량 * load factor

즉, 저장용량이 고정돼 있을 때 element를 증가시키면 load factor도 커질 것이다. 커지다가 0.75에 도달하게 되면 저장용량을 약 두배로 늘린다. 이때 저장용량을 늘리는 과정이 애플리케이션에 부하를 많이 주게 된다. 그래서 저장될 데이터(element)의 수가 대충 짐작이 가능하다면 처음에 객체를 생성할 때 저장용량을 데이터 수에 맞게 설정해주면 좋다. load factor 0.75 값은 API에 제일 이상적인 값이라 나와있다. 물론 개발하려는 애플리케이션의 목적에 따라 값을 수정할 수 있지만 대부분의 상황에선 기본값을 쓰는게 좋다고 한다.


https://onsil-thegreenhouse.github.io/programming/java/2018/02/21/java_tutorial_1-23/

profile
Step by step goes a long way ✨

0개의 댓글