Class 객체가 세트의 요소로 사용되는 경우 HashSet의 내부 작업을 이해하려고했습니다. 여기 내가 한 것은 =>Code < =. 오브젝트 ID가 맵의 모든 값에 대해 동일한 것으로 나타났습니다.Java Map의 같은 객체 ID
이것은 무엇을 의미합니까? 클래스 요소의 새 인스턴스를 만들었으므로 서로 다르지 않아야합니까?
Class 객체가 세트의 요소로 사용되는 경우 HashSet의 내부 작업을 이해하려고했습니다. 여기 내가 한 것은 =>Code < =. 오브젝트 ID가 맵의 모든 값에 대해 동일한 것으로 나타났습니다.Java Map의 같은 객체 ID
이것은 무엇을 의미합니까? 클래스 요소의 새 인스턴스를 만들었으므로 서로 다르지 않아야합니까?
HashSet
은 내부가 HashMap
이고, 여기서 키는 Set
의 요소이며 값은 모두 동일한 더미 개체에 대한 참조입니다. 따라서지도에 표시되는 모든 값은 동일한 개체를 참조합니다.
예를 들어, add()
의 구현을 참조하십시오
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
가 서로 다른되지 않을 경우, 내가 클래스 요소의 새로운 인스턴스를 생성 한 같이
PRESENT
는public boolean add(E e) { return map.put(e, PRESENT)==null; }
?
키만 달라야합니다.
여기에서 확인할 수 있습니다
HashSet의는 HashMap에 사용하여 구현됩니다 :
개인 정적 최종 개체 PRESENT = 새 개체();
키 - 값 쌍을 넣을 때마다 항상 모든 키의 값으로 삽입 된 동일한 개체가 있으므로 PRESENT 인 개체의 ID가 항상 동일합니다. 새로운 키를 넣었지 만 맵의 모든 항목의 값은 동일합니다.
확인이 블로그 :
http://www.java67.com/2014/01/how-hashset-is-implemented-or-works-internally-java.html
http://javahungry.blogspot.com/2013/08/how-sets-are-implemented-internally-in.html
감사합니다. 내가 더 많은 것을 배울 수있는 곳에서 책/블로그를 제안 할 수 있습니까? –
@ User913 너무 일반적인 질문입니다. 나는 그 대답하는 법을 모른다. – Eran
내장 클래스의 소스 코드를 보는 것이 일반적으로 좋은 출발점입니다. – biziclop