9


4

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

6 Answer


27


http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html[LinkedHashMap]はまさにそれを行います。http://java.sun.com/javase/6/についてはjavadocを参照してください。 docs / api / java / util / LinkedHashMap.html#removeEldestEntry(java.util.Map.Entry)[removeEldestEntry]メソッド。

このような何かがトリックをするべきです、これは最も古い挿入されたエントリを削除します:

Map map = new LinkedHashMap(){@オーバーライドプロテクトブールremoveEldestEntry(Entry eldest){return size()> N; ;}};

コンストラクタでそれを指定することによって最もアクセスされたエントリを削除することもできます。

Map map = new LinkedHashMap(16、0.75f、true){@オーバーライドプロテクトブールremoveEldestEntry(Entry eldest){return size()> N; ;}};


5


あなたはおそらく LRU cacheを探していますか? これは LinkedHashMapに基づいたブログ投稿です。


0


あなたはApacheコレクションの使用を検討したいかもしれません。 彼らはたくさんのLRU実装を持っています。 そうでなければ、標準ライブラリコレクション用の同様のラッパーを簡単に書くことができます。直接使えるものはないと思います。


0


両端キュー、または Dequeを使用し、最大数に達したら最初の項目を削除することができます。


0


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

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


-1


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