2016-09-25 3 views
0

Class 객체가 세트의 요소로 사용되는 경우 HashSet의 내부 작업을 이해하려고했습니다. 여기 내가 한 것은 =>Code < =. 오브젝트 ID가 맵의 모든 값에 대해 동일한 것으로 나타났습니다.Java Map의 같은 객체 ID

Variable 이것은 무엇을 의미합니까? 클래스 요소의 새 인스턴스를 만들었으므로 서로 다르지 않아야합니까?

답변

3

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; 
} 

?

키만 달라야합니다.

+0

감사합니다. 내가 더 많은 것을 배울 수있는 곳에서 책/블로그를 제안 할 수 있습니까? –

+0

@ User913 너무 일반적인 질문입니다. 나는 그 대답하는 법을 모른다. – Eran

+3

내장 클래스의 소스 코드를 보는 것이 일반적으로 좋은 출발점입니다. – biziclop

0

여기에서 확인할 수 있습니다

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/HashSet.java#HashSet

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