Strong Root

문제

출력결과는 무엇일까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.HashSet;
import java.util.Set;
 
public class Main {
 
    public static void main(String[] args) {
        Set<Set<Integer>> sets = new HashSet<>();
 
        Set<Integer> set1 = new HashSet<>();
        set1.add(1);
        set1.add(11);
        sets.add(set1);
 
        System.out.println(sets.size());
 
        set1.add(111);
        sets.remove(set1);
        System.out.println(sets.size());
    }
}
cs

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

정답

 

 

해설

HashSet.remove() 소스코드를 계속 따라가보면 HashMap.removeEntryForKey() 까지 이어지고,

여기서 코드를 잘보면 hashCode() 값 비교를 통해 remove를 시도하고 있습니다.

 

그런데 현재 Set 의 멤버도 Set 이므로 HashSet.hashCode() 를 살펴봐야합니다.

해당 소스코드를 보면 충격적이게도,

반복문을 돌며 멤버 전체의 hashCode() 를 더해 리턴하고 있습니다.

따라서 Set 의 내용물(멤버)이 바뀌면 hashCode() 값도 바뀌게 됩니다.

 

문제로 돌아가보면,

16라인에서 set1 의 내용물이 바뀜과 동시에 set1 의 hashCode() 값도 변해버려서

17라인에서 remove() 가 set1 을 찾지못해 지우는데 실패하게된 것입니다.