12

次のコード例では、キーが null に設定されてSystem.gc()呼び出されると、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>();


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

}

Output: Weak Hash Map :{}

WeakHashMapとともに使用されHashMap、キーが null に設定されている場合、は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私の質問は、キーが破棄された後でも、2 番目のコード例でエントリが失われないのはなぜですか?

4

6 に答える 6

20

WeakHashMapキーがライブ コードから強力に到達できなくなった場合、Aはエントリを破棄します。はキーへのハード リファレンスを保持しているためHashMap、キーは引き続き到達可能であり、WeakHashMapはエントリを破棄しません。

要点は、一度にキーへの参照を持っていた可能性のある変数の値ではなく、キー オブジェクトへの参照に動作が関係しているということです。

于 2013-09-23T17:20:01.317 に答える
4

それ以外の場所ではオブジェクトを破棄する必要があり、WeakHashMap はそのオブジェクトをクリアします。WeakReference と同様に、その目的は、オブジェクトがまだ使用されている場合にそのオブジェクトを記憶することです。オブジェクトを永久に保持するメモリリークを引き起こすことなく。

あなたの例hm = null;では、WeakHashMap のクリーンアップの魔法を見るように設定されています。

于 2013-09-23T17:18:39.943 に答える
0

JVM がガベージ コレクターを実行し、参照変数を持たないオブジェクトが見つかった場合、それを破棄しますが、そのオブジェクトが HashMap のキーとして機能している間、ガベージ コレクターはそれを破棄しません。WeakHashmap の場合、参照がなければキーとして機能してもオブジェクトを破棄します。上記のコードでも k1,k2,k3,k4=null

ただし、これらのオブジェクトはハッシュマップのキーであるため、ガベージ コレクションによって破棄されることはありません。破棄したい場合は、 hm=null; を設定して Hashmap から削除します。次に System.gc(); k1、k2、k3、k4を破壊します

于 2020-06-24T18:59:49.570 に答える
0

HashMap は gc (ガベージ コレクター) を支配します。

gc が WeakHashMap を支配しています。

k1、k2、k3、k4 に null を設定しても、gc は HashMap から削除しません。gc はそれらをすべて削除し、WeakHashMap の空のマップを提供するため、WeakHashMap という名前が付けられています

于 2014-08-21T06:54:06.160 に答える