Javaプログラミングにおいて、WeakHashMap
は一般的なマップとは異なる特殊な挙動を持つことで知られています。WeakHashMap
は弱い参照を使用しており、参照しているオブジェクトが他で強い参照を持っていない場合、ガベージコレクションの対象となります。
1. WeakHashMapの基本的な使用法
WeakHashMap
を使用することで、キーが弱い参照となるため、キーが不要になるとガベージコレクションによって自動的にエントリが削除されます。以下は基本的な使用法の例です。
import java.util.WeakHashMap;
public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<Key, String> weakHashMap = new WeakHashMap<>();
Key key = new Key();
weakHashMap.put(key, "Value");
// keyを参照している他の箇所がなくなると、ガベージコレクションによりエントリが自動削除される
key = null;
// 何らかの処理...
// もしくは、明示的に削除することも可能
// weakHashMap.remove(key);
System.out.println("WeakHashMap size: " + weakHashMap.size()); // サイズは1から0に変化する
}
}
class Key {
// キーのクラス
}
2. 使用ケース: キャッシュの実装
WeakHashMap
はキャッシュの実装において、キャッシュのエントリがメモリを無駄に消費しないようにするために利用されることがあります。弱い参照を使用することで、メモリリークのリスクを軽減できます。
import java.util.Map;
import java.util.WeakHashMap;
public class Cache {
private Map<String, ExpensiveObject> cache = new WeakHashMap<>();
public ExpensiveObject getFromCache(String key) {
ExpensiveObject result = cache.get(key);
if (result == null) {
result = createExpensiveObject();
cache.put(key, result);
}
return result;
}
private ExpensiveObject createExpensiveObject() {
// 何らかの costly な処理を行う
return new ExpensiveObject();
}
}
class ExpensiveObject {
// 高コストなオブジェクトのクラス
}
WeakHashMap
はキーへの弱い参照を使用することで、キャッシュが不要になった時点でメモリを解放することができます。
これらの例はWeakHashMap
がどのように使用されるかを示していますが、注意が必要です。弱い参照は使用において慎重に扱う必要があり、プログラムの挙動を理解してから利用することが重要です。