(n + 1) 番目のエントリが挿入されるときに、最も古いエントリが最初に削除され、ハッシュテーブルのサイズが常に n に制限されるように、番号 n を指定できる手法はありますか?
6 に答える
LinkedHashMapはまさにそれを行います。removeEldestEntryメソッドについては javadoc を参照してください。
これは、挿入された最も古いエントリを削除します。
Map map = new LinkedHashMap() {
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > N;
}
};
コンストラクターで指定することにより、最も古いアクセスされたエントリを削除することもできます。
Map map = new LinkedHashMap(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > N;
}
};
おそらくLRUキャッシュを探していますか?LinkedHashMapに基づくブログ投稿を次に示します。
同時実行が必要な場合は、この問題を自分で解決しようとしないでください。Guava のCacheBuilderには、マップのサイズを制限できる .maximumSize() メソッドがありますが、実際に制限に達する前に古いエントリが消去される可能性があることは理解しています。
データ構造の設計に関する興味深いページがあり、Google の実装よりも優れたものを作ることがいかに難しいかを読者に印象づけるはずです。:)
Apache コレクションの使用を検討することをお勧めします。彼らはたくさんの LRU 実装を持っています。それ以外の場合は、標準ライブラリ コレクション用の同様のラッパーを簡単に作成できます。直接使用できるものはないと思います。
両端キューまたはDequeを使用して、最大数に達したときに最初のアイテムを削除するだけです。
キャッシュしている場合は、WeakHashMap または WeakReference を使用でき、キャッシュのサイズを気にする必要はありません。