2013-04-22 7 views
2

안드로이드에서 객체 참조를 전달하는 방법에 대한 연구를 수행하면서 다음에 대해 생각해 보았습니다.Long, Int 또는 String과 같은 WeakHashMap

키가 Long 인 WeakHashmap이 있다고 가정 해 보겠습니다. 그리고 이제 하나의 Object를이 WeakHashMap에 넣고 키 'new Long (1)'에 할당합니다 (이 Long에 대한 참조를 저장한다고 가정).

이제 응용 프로그램의 다른 부분이 새로운 Long (1)을 만들고 그 이후에 널 (null)로 첫 번째 Long (키로 사용됨)을 설정했습니다.

  1. WeakHashMap의 Object는 어떻게됩니까?
  2. Long을 자신의 Class로 Long을 Long으로 대체하고 같은 값을 가진 동일한 유형의 다른 객체 (예 : 내 클래스)와 Long을 비교하면 compare() - Method가 true를 반환합니다.
  3. 두 경우 모두 WeakReference가 지워진다 고 가정합니다. 첫 번째를 지우기 전에 WeakHasMap에 액세스하기 위해 두 번째로 만든 키를 사용하면 차이가 있습니까?
+0

제어하지 않는 유형의 WeakHashMap을 사용하면 꽤 위험합니다. –

+0

보통 위험한 일은 자신이하는 일을 알면 매우 편리해질 수 있습니다. 그것이 내가 묻는 이유입니다 ;-) – Chris

답변

10

약한 참조는 메모리에 대한 강력한 참조가 없을 때 가비지 수집됩니다.

이제 예를 들어 보겠습니다. 이것은 조금 까다 롭습니다. javadoc for Long에서 valueOf 메서드는 "자주 요청 된 값 캐싱"으로 성능을 향상시킵니다. 즉, valueOf 또는 new을 사용하든 대답에 차이가 나게됩니다.

귀하의 경우에는 new을 사용하므로 각 new Long(1)은 다른 개체, 즉 다른 참조가됩니다. 그러나 이것은 Integer, Long이며 다른 래퍼 유형은 대개 WeakHashMap에서 예상대로 동작하지 않을 수 있으므로 캐싱됩니다. String은 인턴되기 때문에 문제가 있습니다. 어쨌든

, 당신의 질문에 대답 없습니다 :

  1. 를 더 한 다음 매핑은 다음 기회에 GC'ed됩니다 Long 원래 당신에게 더 강한 참조가있는 경우.
  2. 여기 혼란스러워합니다. A HashMap은 비교를 위해 hashcodeequals을 사용합니다. TreeMapcompareTo을 사용합니다. 어쨌든 그것은 아무런 차이를 만들지 않을 것이다. 이것은 평등의 개념에 관한 것이 아니라 참조에 관한 것이다. 개체에 대한 더 이상 강력한 참조가 없으면 매핑이 GC됩니다.
  3. 아니요. 내가 2에서 말했듯이 - MapMap에 키가 있는지를 확인할 때 hashcodeequals을 사용합니다. Weak 부분은 참고 문헌입니다. 두 개체는 equals 일 수 있지만 ==은 그렇지 않을 수 있습니다.

PhantomReference ~ track when your key is GC'ed을 사용할 수 있습니다. 그러면 약한 참조가 작동하는 방식을 이해하는 데 도움이 될 수 있습니다.

+0

명확한 대답. 감사 – Chris