2014-03-07 3 views
0

내가 the following tutorial를 통해 진행되고 있고,이 코드 건너 온 :새로운 자바에 - 새로운 String의 관계()과의 WeakHashMap

String hold = "Maine"; 
map.put(hold, "Augusta"); 
:

map.put(new String("Maine"), "Augusta"); 

그냥 내가 그것을 변경, 실험

결과적으로 루프는 WeakHashMap을 사용하기 때문에이 객체가 가비지 수집을하지 못하게된다는 것을 의미합니다. 나는 이것이 왜 있는지 전혀 모른다. 이 상황에서 String과 다른 새로운 String()을 만드는 것이 무엇이겠습니까?

또한 .. 거기에 또 하나의 질문이 있습니다 - 왜이지도는 정적이어야합니까 그렇지 않으면 키가 오류를 줄 것입니까?

답변

2

으로 당신이 게시 된 링크 설명 :

는 키가 더 이상 참조의 WeakHashMap의 외부

그래서 처음에있을 때 키 - 값 쌍은 을 garbagecollected 할 수 있습니다 예를 들어 "Maine" 문자열은 외부에서 참조하지 않으므로 결국 (GC 실행시) 가비지 수집됩니다. 두 번째 예에서는 WeakHashMap (hold에 의해) 외부에서 참조되므로 가비지 수집되지 않습니다.

+0

감사합니다, 어떻게 거기에 더 많은 질문이 하나 있습니다 -이지도는 정적이거나 그렇지 않으면 키가 오류를 발생시키는 이유는 무엇입니까? – user3134565

+0

@ m0skit0가 완전히 정확하면''Maine ''가 _ 가비지 수집됩니다. 이 문제가 즉시 발생하지 않아도됩니다. 심지어 전혀 일어나지 않을 수도 있습니다. – gexicide

+0

@gexicide 가비지 수집 될 때 GC가 실행될 때 발생합니다. 너무 과체주의하지 않으려 고 노력합시다.) – m0skit0

0

문자열 보류를 선언하면 강력한 참조가 만들어집니다. 즉, weakmap 외부의 일부 변수가 해당 String을 참조하기 때문에 "Maine"가 가비지 수집되지 않아야합니다.

초기 예제에서 "Maine"에 대한 유일한 참조는 weakmap 내부에 있으므로이 참조를 "weak"라고합니다. 변수가 가비지 수집됩니다

+0

감사합니다. 한가지 더 질문이 있습니다. 왜이지도가 정적인지 아니면 다른지도를 포함해야합니까? 키가 오류를 줄 것입니까? – user3134565

+0

정적 메서드에서 코드를 실행하므로 정적이 아닌 개체에 액세스 할 수 없으므로 정적이 아닌 개체로 만들려면 WeakHashMap의 새 엔터티를 만들어야합니다. 이 새로운 객체를 통해지도에 액세스 할 수 있습니다. –

관련 문제