"글쎄, 당신의 프로세서는 어떻습니까?"

"괜찮아요. 한 시간 동안 액체 질소에 앉아 있었으니 이제 새것이나 다름없어요!"

"좋아. 그럼 계속하자."

"컬렉션 설정."

수학적으로 말하면 집합은 고유한 요소의 그룹입니다. 따라서 프로그래밍에서 세트는 고유한 요소의 모음입니다. 즉, 동일한 요소를 저장할 수 없도록 하는 모음입니다.

"Ellie가 Set의 상속 계층 구조를 보여줬는지 모르겠습니다. 그렇지 않다면 다음과 같습니다."

Set 및 Queue 인터페이스의 구현 - 1

" HashSet은 hashCode () 메서드 에서 반환된 해시 값을 사용하여 내부적으로 요소를 저장하는 컬렉션입니다 ."

"단순화를 위해 HashSet<E>는 HashSet의 값을 키로 저장하는 HashMap<E, Object> 개체를 저장합니다."

"워!"

"해시 코드를 사용하면 Set에서 요소를 빠르게 검색, 추가 및 제거할 수 있습니다."

"하지만 클래스의 개체를 Set에 추가하고 거기에서 올바르게 찾으려면 클래스가 hashCode & equals 메서드를 올바르게 구현해야 한다는 점을 명심하십시오 ."

"두 방법 모두 HashSet/HashMap 내부에서 많이 사용됩니다 . "

" hashCode () 메서드를 구현하는 것을 잊어버리면 Set에서 개체가 있더라도 개체를 찾을 수 없는 위험이 있습니다."

"네, 기억해요, 기억해요. 당신이 전에 이것에 대해 말했잖아요. 난 그것에 대해 다 들었어요."

"알겠습니다. 그럼 유용한 정보를 좀 더 알려드리겠습니다."

" 클래스에서 hashCode와 equals를  올바르게 구현했고 Set에 개체를 행복하게 저장했다고 가정합니다 ."

"하지만 객체 중 하나를 변경하면 해시 를 계산하는 데 사용되는 내부 데이터가 변경됩니다 . 따라서 객체의 해시가 변경됩니다."

"그리고 이것은 당신이 세트에서 그것을 검색할 때 아마 그것을 찾지 못할 것이라는 것을 의미합니다."

"와우! 어떻게 작동합니까?"

"이것은 해시로 작업할 때 잘 알려진 함정입니다. 기본적으로 HashSet(및 HashMap) 검색은 개체가 변경 불가능한 경우에만 제대로 작동하도록 보장됩니다 . "

"와우! 그리고 아무도 그것에 대해 아무것도하지 않습니까?"

"다들 문제가 없는 척해요. 그런데 이건 인터뷰에서 자주 나오니까 기억해두는 게 좋을지도..."

"A LinkedHashSet 은 해당 요소가 연결된 목록에도 저장되는 HashSet입니다. 일반 HashSet는 요소의 순서 지정을 지원하지 않습니다. 첫째, 단순히 공식적인 작업이 아닙니다. 둘째, 내부 순서조차 단일 요소가 추가되었습니다."

그러나 LinkedHashSet 에서 반복자를 가져와 LinkedHashSet 에 추가된 순서대로 모든 요소를 ​​통과하는 데 사용할 수 있습니다 . 자주 발생하지는 않지만 때때로 이것은 매우 필요합니다."

"그렇구나. 만약의 경우를 대비해서 수업이 있는 게 좋아. 그런 경우가 그리 드물지 않아."

" TreeSet은 값에 따라 정렬된 트리 형태로 요소를 저장하는 컬렉션입니다. TreeSet <E> 에는 이러한 모든 값을 저장하는 TreeMap <E, Object>가 포함되어 있습니다. 그리고 이 TreeMap은 균형 잡힌 빨강 -검정 트리를 사용하여 저장합니다. 요소 . 결과적으로 매우 빠른 추가, 제거 및 포함 작업을 지원합니다."

"네, 기억나네요. 최근에 의논했어요. 그리고 이게 어디에 쓰일지도 생각했어요."

"그리고 Java의 가장 인기 있는 컬렉션 중 일부가 이를 사용하는 것으로 밝혀졌습니다."

"네. 그런데 면접관은 종종 TreeSet 에 대해 묻습니다. 그들은 보통 당신을 속이려고 합니다. 그들은 'TreeSet이 이진 트리를 사용하면 모든 요소가 하나의 긴 분기를 형성할 수 있으므로 검색에 오랜 시간이 걸린다고 말할 것입니다. «TreeSet과 TreeMap이 균형 잡힌 적흑 트리 를 사용한다는 것은 어린아이도 알고 있기 때문에 실제로는 불가능한 상황입니다.»

"아. 그 질문을 한 사람의 얼굴을 보고 싶다. 그 문구를 외울 수도 있다. …"

"하지만 실제로 세트는 내가 처음에 생각했던 것만큼 단순하지 않은 것으로 판명되었습니다."

"반면에 Queue 의 상황은 훨씬 간단합니다."

Set 및 Queue 인터페이스 구현 - 2

" Queue는 queue를 구현합니다. 요소는 queue의 끝에 추가되고 앞쪽에서 가져옵니다."

" 기술적으로 대기열이기도 한 LinkedList 를 제외하고 PriorityQueue 는 실제로 Queue 인터페이스 의 유일한 클래식 구현입니다 ."

"알았어, 피곤해. 오늘은 여기까지야. 다음 시간까지."