4.1) OCJP/1Z0-851 / 2012-08-28

OCJP (1Z0-851 / 2012-08-28 / Exam C) - 28 번

kkikkodev 2016. 11. 13. 00:02



관련 이론 및 문법

(HashSet 클래스 참고)

http://kkikkodev.tistory.com/215


(TreeSet 클래스 참고)

http://kkikkodev.tistory.com/119


(LinkedHashSet 클래스 참고)

http://kkikkodev.tistory.com/459


문제 의도

주어진 코드에서 4 라인에, 코드를 추가했을 때 [1, 2] 를 출력함을 보장하는 보기를 고르는 문제입니다.


답안

A


풀이 방법

set 에 2 를 먼저 추가하고, 1 을 나중에 추가했는데도 오름차순으로 정렬되어 출력되어야 합니다. 


보기 A 의 TreeSet 은 기본적으로 오름차순으로 정렬하여 출력하도록 되어 있습니다. 따라서 보기 A 는 답안이 됩니다.


보기 B 의 HashSet 은 기본적으로 순서를 보장하지 않고 출력하도록 되어 있습니다. 하지만 2 와 1 이 저장되어 있는 이 경우는 [1, 2] 로 출력이 됩니다. 오름차순으로 정렬된 것처럼 보이지만, 이것은 운이 좋아서 정렬된 것처럼 보이는 것입니다. 초기에 HashSet 의 테이블 사이즈는 16 입니다. 처음 2 객체를 추가하면 hashCode 는 2 이므로 (자신의 값을 리턴하도록 overriding 되어 있으므로) 테이블의 2 번지에 저장이 됩니다. 그 다음 1 객체를 추가하면 hashCode 는 1 이므로 테이블의 1 번지에 저장이 됩니다. HashSet 은 출력할 때 Iterator 가 테이블의 0 번지부터 차례대로 순회하면서 출력하므로 우연히 1 번지에 있는 1 이 먼저 출력되고 2 번지에 있는 2 가 먼저 출력되는 것입니다. 만약 1 이 아닌 17 을 저장했다면 17 은 1 번지에 저장되므로 2 가 먼저가 아닌, 17 이 먼저 출력이 되었을 것입니다. 따라서 HashSet 은 오름차순 정렬 출력을 보장하지는 않으므로 답안 후보에서 제외합니다.


보기 C 의 SortedSet 과 D 의 SortedList 는 존재하지 않는 클래스이므로 답안 후보에서 제외합니다.


보기 E 의 LinkedHashSet 은 HashSet 의 구조인데, 추가한 순서를 기억하고 있기 때문에, 출력 결과는 [2, 1] 로 됩니다. 따라서 답안 후보에서 제외합니다.


결과적으로 A 가 답안이 됩니다.