Set은 List와 달리 순서를 신경쓰지 않는다. 데이터가 존재하냐 안하냐만이 중요하다. 어떤 웹 사이트에서 하루에 접속하는 사람들 수를 구하고자 한다. 접속하는 IP를 세면 될 것이다. 근데 한사람이 여러번 접속하면 한 IP가 여러번 찍힐 것, 이건 한번으로 카운트 해줘야 제대로 된 접속자 수를 구할 수 있다. 이럴 때 쓰는게 Set이다.
Set 인터페이스를 구현한 주요 클래스는 3개가 있다.
3개의 클래스가 성능 차이가 나는 이유는 데이터 정렬 때문이다. HashSet은 별도의 정렬 작업이 없어 제일 빠르다. 하지만 수백만 건의 데이터를 처리하는게 아니면 크게 체감하기는 힘들다고 한다.
AbstractCollection을 확장한 건 ArrayList와 같지만, HashSet은 AbstractSet을 확장헸다. AbstractSet 문서에 들어가보면 구현되어 있는 메소드는 equals(), hashCode(), removeAll() 3개 뿐이다. Set은 순서가 필요없고, 중복을 허용하지 않으므로 중복을 체크하는 equals()와 hashCode()는 필수
총 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/