22

WeakHashMapを次のように作成します

WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>();
map.put(emp,"hello");

ここで、empはEmployeeオブジェクトです。ここで、emp = nullを実行するか、empオブジェクトが参照されなくなったとすると、エントリはWeakHashMapから削除されますか?つまり、Mapのサイズはゼロになりますか?
また、HashMapの場合はその逆になりますか?
WeakHashMapの私の理解は正しいですか?

4

6 に答える 6

41

非常に簡単な例で、すでに言われていることを啓蒙するために:

import java.util.WeakHashMap;

public class WeakHashMapDemo {

    public static void main(String[] args) {
        // -- Fill a weak hash map with one entry
        WeakHashMap<Data, String> map = new WeakHashMap<Data, String>();
        Data someDataObject = new Data("foo");
        map.put(someDataObject, someDataObject.value);
        System.out.println("map contains someDataObject ? " + map.containsKey(someDataObject));

        // -- now make someDataObject elligible for garbage collection...
        someDataObject = null;

        for (int i = 0; i < 10000; i++) {
            if (map.size() != 0) {
                System.out.println("At iteration " + i + " the map still holds the reference on someDataObject");
            } else {
                System.out.println("somDataObject has finally been garbage collected at iteration " + i + ", hence the map is now empty");
                break;
            }
        }
    }

    static class Data {
        String value;
        Data(String value) {
            this.value = value;
        }
    }
}

出力:

    map contains someDataObject ? true
    ...
    At iteration 6216 the map still holds the reference on someDataObject
    At iteration 6217 the map still holds the reference on someDataObject
    At iteration 6218 the map still holds the reference on someDataObject
    somDataObject has finally been garbage collected at iteration 6219, hence the map is now empty
于 2012-05-15T11:58:05.780 に答える
14

サンプルコードを実行して、との違いを理解しましHashMapWeakHashMap

            Map hashMap= new HashMap();
            Map weakHashMap = new WeakHashMap();

            String keyHashMap = new String("keyHashMap");
            String keyWeakHashMap = new String("keyWeakHashMap");

            hashMap.put(keyHashMap, "helloHash");
            weakHashMap.put(keyWeakHashMap, "helloWeakHash");
            System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

            keyHashMap = null;
            keyWeakHashMap = null;

            System.gc();  

            System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

出力は次のようになります。

Before: hash map value:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null
于 2013-06-29T13:06:36.073 に答える
6

*エントリはWeakHashMapから削除されますか、つまりMapのサイズはゼロになりますか?*

従業員が強く到達可能empになる最後の参照が含まれている場合、マップのエントリが削除される可能性があります。

Javaのドキュメントはそれをかなりうまくまとめています:

弱鍵を使用したハッシュテーブルベースのマップ実装。WeakHashMapのエントリは、そのキーが通常使用されなくなると自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、そのキーがガベージコレクターによって破棄されるのを防ぐことはできません[...]。キーが破棄されると、そのエントリはマップから効果的に削除されるため、このクラスは他のMap実装とは多少異なる動作をします。

 

また、HashMapの場合はその逆になりますか?

WeakHashMapからエントリを削除しても、プログラム内の他の参照には影響しません。

于 2012-05-15T11:28:26.267 に答える
2

WeakHashMapの例:

Map map = new WeakHashMap();
Foo foo =  new Foo();
map.put(foo, "bar");
foo=null; // strong refrence is removed and object is available for garbage collection.  

HashMapの例:

Map map = new HashMap();
Foo foo =  new Foo();
map.put(foo, "bar");
foo=null; // even though the reference is nullified object will not garbage collected because map is having Strong refrence.
于 2017-12-16T11:33:12.210 に答える
1

Javaでの参照は、作成されたオブジェクトがメモリ内で指すメモリアドレスです。WeakHashMapでは、弱参照の概念が使用されます。

Javaでオブジェクトを作成し、それを変数に割り当てるとすぐに、オブジェクトは強力に到達可能になります。

弱参照オブジェクトは、メモリ参照を持たないオブジェクトにいくらか似ている可能性があります。つまり、ガベージコレクションが可能になります。

于 2015-01-08T15:01:13.607 に答える
1

HashMapのような他のMap実装では、キーは強力に到達可能です。たとえば、以下に示すように、HashMapにPersonクラスとしてキーがあり、Personオブジェクトがnullに設定されている場合、この後でもmap.get(Person)を実行すると、キーが強く参照されるため、メモリから値が取得されます。 HashMapで。

wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Hash Map :" + wm.toString());

出力:ハッシュマップ:{test.Person@12dacd1=John}

HashMapと比較すると、WeakHashMapは、キーがメモリ内に参照を持たなくなるとすぐに入力を削除するものです。たとえば、以下に示すように、WeakHashMapにPersonクラスとしてキーがあり、Personオブジェクトがnullに設定されている場合、map.get(Person)を実行すると、キーに参照がないため(または、弱く)、nullが取得されます。到達可能)。

wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Weak Hash Map :" + wm.toString());

出力:弱いハッシュマップ:{}

于 2015-01-13T14:18:27.923 に答える