9

(n + 1) 番目のエントリが挿入されるときに、最も古いエントリが最初に削除され、ハッシュテーブルのサイズが常に n に制限されるように、番号 n を指定できる手法はありますか?

4

6 に答える 6

28

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;
        }
    };
于 2009-01-07T22:11:48.457 に答える
5

おそらくLRUキャッシュを探していますか?LinkedHashMapに基づくブログ投稿を次に示します。

于 2009-01-07T21:34:15.663 に答える
0

同時実行が必要な場合は、この問題を自分で解決しようとしないでください。Guava のCacheBuilderには、マップのサイズを制限できる .maximumSize() メソッドがありますが、実際に制限に達する前に古いエントリが消去される可能性があることは理解しています。

データ構造の設計に関する興味深いページがあり、Google の実装よりも優れたものを作ることがいかに難しいかを読者に印象づけるはずです。:)

于 2013-08-22T21:05:25.040 に答える
0

Apache コレクションの使用を検討することをお勧めします。彼らはたくさんの LRU 実装を持っています。それ以外の場合は、標準ライブラリ コレクション用の同様のラッパーを簡単に作成できます。直接使用できるものはないと思います。

于 2009-01-07T21:37:30.727 に答える
0

両端キューまたはDequeを使用して、最大数に達したときに最初のアイテムを削除するだけです。

于 2009-01-07T21:41:41.543 に答える
-1

キャッシュしている場合は、WeakHashMap または WeakReference を使用でき、キャッシュのサイズを気にする必要はありません。

于 2009-01-07T21:57:30.530 に答える