2013-09-23 6 views
6

키가 null로 설정되고 System.gc()이 호출 될 때 WeakHashMap은 모든 매핑을 잃고 비워집니다. WeakHashMapHashMap와 함께 사용되며, 키가 null로 설정되어 WeakHashMap vs HashMap

Output: Weak Hash Map :{}

class WeakHashMapExample { 

public static void main(String[] args) { 

    Key k1 = new Key("Hello"); 
    Key k2 = new Key("World"); 
    Key k3 = new Key("Java"); 
    Key k4 = new Key("Programming"); 

    Map<Key, String> wm = new WeakHashMap<Key, String>(); 


    wm.put(k1, "Hello"); 
    wm.put(k2, "World"); 
    wm.put(k3, "Java"); 
    wm.put(k4, "Programming"); 
    k1=null; 
    k2=null; 
    k3=null; 
    k4=null; 
    System.gc(); 
    System.out.println("Weak Hash Map :"+wm.toString()); 

} 

} 

class Key{ 

private String key; 

public Key(String key) { 
    this.key=key; 
} 

@Override 
public boolean equals(Object obj) { 
    return this.key.equals((String)obj); 
} 
@Override 
public int hashCode() { 
    return key.hashCode(); 
} 
@Override 
public String toString() { 
    return key; 
} 

} 

WeakHashMap는 키와 값의 매핑을 잃지 않는다.

class WeakHashMapExample { 

public static void main(String[] args) { 

    Key k1 = new Key("Hello"); 
    Key k2 = new Key("World"); 
    Key k3 = new Key("Java"); 
    Key k4 = new Key("Programming"); 

    Map<Key, String> wm = new WeakHashMap<Key, String>(); 
    Map<Key, String> hm=new HashMap<Key, String>(); 

    wm.put(k1, "Hello"); 
    wm.put(k2, "World"); 
    wm.put(k3, "Java"); 
    wm.put(k4, "Programming"); 

    hm.put(k1, "Hello"); 
    hm.put(k2, "World"); 
    hm.put(k3, "Java"); 
    hm.put(k4, "Programming"); 
    k1=null; 
    k2=null; 
    k3=null; 
    k4=null; 
    System.gc(); 
    System.out.println("Weak Hash Map :"+wm.toString()); 
    System.out.println("Hash Map :"+hm.toString()); 
} 

} 

class Key{ 

private String key; 

public Key(String key) { 
    this.key=key; 
} 

@Override 
public boolean equals(Object obj) { 
    return this.key.equals((String)obj); 
} 
@Override 
public int hashCode() { 
    return key.hashCode(); 
} 
@Override 
public String toString() { 
    return key; 
} 

} 

출력 : Weak Hash Map :{Java=Java, Hello=Hello, World=World, Programming=Programming} Hash Map :{Programming=Programming, World=World, Java=Java, Hello=Hello}

WeakHashMap 두 번째 코드 예제에 키가 폐기 후에도 그 항목을 잃지 않는 이유를 내 질문은?

답변

11

WeakHashMap은 더 이상 라이브 코드에서 키에 연결할 수 없을 때 항목을 삭제합니다. HashMap은 키에 대한 하드 참조를 유지하므로 키에 계속 도달 할 수 있으며 WeakHashMap은 항목을 삭제하지 않습니다.

요점은 동작이 한 번에 키에 대한 참조를 가질 수있는 변수의 값이 아니라 키 객체에 대한 참조와 관련이 있다는 점입니다. 당신은 포인터 k1,k2,k3,k4하지만 HashMapWeakHashMapnull을 설정 한

+0

포인터를 포함하고있는 변수를 생각조차하지 못했습니다. 매우 유익합니다. 감사합니다! – xorinzor

2

개체은 다른 모든 곳에서 버려 져야하며 WeakHashMap은 해당 개체를 지 웁니다. 약점 참조 (WeakReference)와 마찬가지로 객체가 아직 사용 중이면 그 객체를 기억하는 것이 목적입니다. 영원히 객체를 보유하고있는 메모리 누수가 발생하지 않습니다.

WeakHashMap 정리 마법을 보려면 hm = null;을 설정하십시오.

+0

예, 설정'HM = null' 우리에게 하늘의 맵을 제공하기 때문에 'System.gc()'가 WHM을 지우기 전에. 고마워, 알았다. – Nishant

3

여전히 그 Keys에 대한 참조를 포함합니다. HashMap에 referenece가 포함되어 있기 때문에 키의 실제 인스턴스는 GC에 의해 삭제되지 않습니다. WeakHashMap은 여전히 ​​모든 내용을 인쇄합니다.

이 예제를 HashMap ->으로 실행하십시오.이 여전히 해당 내용을 유지할 수 있다고해도 말입니다.

0

HashMap이 gc (가비지 수집기)를 압도합니다.

gc WeakHashMap을 지배합니다. 우리가 늘의 HashMap에서 제거 K1, K2, K3, K4의 GC에 널 (null)로 설정하더라도

곳 GC 그들 모두를 제거하고의 WeakHashMap 따라서 이름의 WeakHashMap