2014-05-12 5 views
2

WeakHashMap에 일부 데이터를 저장하려고하지만 문제가 있습니다. 우리가 코드를 가지고 말 :Java WeakHashMap 항목이 검사 후 사라지지 않는다고 보장 할 수 있습니까?

public class WeakMapTest { 
    public static void main(String[] args) { 
     WeakHashMap<Object, Object> map = new WeakHashMap<Object, Object>(); 
     map.put(null, 0); 
     map.put(new Integer(1), null); 
     map.put(new Integer(2), 2); 
     System.out.println(map.get(new Integer(2))); 

     System.gc(); //assume this call made implicitly by JVM 
     if (map.containsKey(new Integer(2))) { 
      System.out.println(map.get(new Integer(2))); 
     } else { 
      System.out.println("Key is deleted"); 
     } 
    } 
} 

출력이 논리적이다

2 
Key is deleted 

될 것입니다.

그러나이 다른 경우입니다 :

if (map.containsKey(new Integer(2))) { 
     System.gc(); //assume this call made implicitly by JVM 
     System.out.println(map.get(new Integer(2))); 
    } else { 
     System.out.println("Key is deleted"); 
    } 

은 결과가 좋지 않다 :

나는 그런 잘못된 결과를 피할 수있는 방법
2 
null 

? 값과 키는 null 일 수 있습니다.

답변

1

이 질문을 쓰는 동안 해결 방법을 찾아서 공유하기로 결정했습니다.

Object value = map.get(new Integer(2)); 
if (map.containsKey(new Integer(2))) { 
    System.gc(); // can happen here 
    System.out.println(value); 
} else { 
    System.out.println("Key is deleted"); 
} 

저는 먼저 가치를 얻고 핵심 존재를 확인해야합니다. 그렇게하면 잘못된 결과로부터 보호됩니다. 현재 결과는 다음과 같습니다.

2 
2 

정확한지, 적어도 제 경우입니다.

+1

귀하의 솔루션이 정확하게 최적이 아닙니다. 당신은'Object value = map.get (new Integer (2)); if (value! = null) System.out.println (value);'. 게다가, "잘못된 결과"가 없습니다. 'WeakHashMap'을 수집하고 싶지 않으면 잘못 사용하고 있습니다. – Kayaman

+0

값이 null 일 수 있다고 명시 적으로 말했기 때문에 최적화가 내 경우에는 효과가 없을 것입니다. 나는 그것들을 (OutOfMemory를 막기 위해) 수집하기를 원하지만, 'get'함수를 사용할 때 null이 원래 객체인지, 아니면 가비지 수집되었는지는 알 수 없다. – DeGriz

+0

@Kayaman 'null'값이 허용되는 경우 'null'과 비교하는 것은 좋은 생각이 아닙니다. – assylias