[추천] Set of Set 문제 및 Set.hashCode()고찰
뿌리튼튼 CS/Java2019. 4. 18. 15:38
문제
출력결과는 무엇일까요?
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 을 찾지못해 지우는데 실패하게된 것입니다.
'뿌리튼튼 CS > Java' 카테고리의 다른 글
심심풀이 문제6 - 상속과 오버라이딩 (Heritage & Overriding) (0) | 2016.10.04 |
---|---|
심심풀이 문제5 - 예외 처리 흐름 (Exception handling flow) (0) | 2016.10.04 |
심심풀이 문제4 - Object Assign (객체 대입) (0) | 2016.10.04 |
심심풀이 문제3 - Call by Value vs Call by Reference (0) | 2016.10.04 |
심심풀이 문제2 - String (0) | 2016.08.02 |