CS스터디에서 자료구조를 공부했고, HashSet은 정렬되지 않는 것으로 배웠다. 근데 데이터에 따라 종종 정렬되어 저장되는 것처럼 보이는 경우를 보게 되었다. HashSet에 데이터가 어떻게 저장되는지 궁금하여 이 글을 작성한다
public static void main(String[] args) {
//##############################################
HashSet<Integer> set = new HashSet<>();
set.add(4);
set.add(3);
set.add(1);
set.add(5);
System.out.println(set); // [1, 3, 4, 5] ?! why?
//##############################################
set = new HashSet<>();
set.add(4);
set.add(3);
set.add(1);
set.add(2);
System.out.println(set); // [1, 2, 3, 4] ?! why?
//##############################################
set = new HashSet<>();
set.add(124);
set.add(33);
set.add(50);
set.add(1);
System.out.println(set); // [33, 1, 50, 124] // 정렬되지 않는 건 맞는데..
//##############################################
}
HashSet<Integer> set = new HashSet<>();
set.add(124);
set.add(33);
set.add(50);
set.add(1);
System.out.println(set); // [33, 1, 50, 124]
124가 추가 되었을 때,
12번 인덱스가 비어있으므로 새로운 노드를 만들어 저장한다.
33이 추가 되었을 때,
1번 인덱스가 비어있으므로 새로운 노드를 만들어 저장한다.
50이 추가 되었을 때,
2번 인덱스가 비어있으므로 새로운 노드를 만들어 저장한다.
1이 추가 되었을 때,
1번 인덱스에 이미 존재하는 노드가 있기 때문에 그 뒤에 연결한다.
p 노드가 이전 노드를 나타내는데, 해당 노드의 key값이 33인 것을 볼 수 있다.
그림으로 요약하자면 이렇게 정리할 수 있겠다.
출력할 때 각 index의 노드들을 next를 통해 순차적으로 출력하게 되며,
이로써[33, 1, 50, 124] 이라는 값이 출력되는 것으로 볼 수 있다.