web-dev-qa-db-ja.com

WeakHashMapの例

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

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

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

21
Anand

サンプルコードを実行して、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
11
Anand

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

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
39
Yanflea

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

empに従業員を作成する最後の参照が含まれている場合 非常に到達可能 マップ内のエントリは削除される可能性があります

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

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

そしてHashMapの場合はその逆になりますか?

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

6
aioobe

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.
2
Premraj

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

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

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

1
Kumar Bhatia

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());

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

1
Deepa Bhatia