2

LinkedHashMapLRU キャッシュを実装するのは素晴らしいようです。リンクされたリストの管理に関してオーバーヘッドがあり、スレッドセーフではありませんが、実装が簡素化され、コードでこれらを処理できます。

removeEldestEntry が実装されていて、リストがいっぱいである場合に、LinkedHashMap がリストから削除する要素の数です。

要素を 1 つだけ削除しますか? または合計サイズの何パーセントか。私の懸念は、新しい要素を配置するために要素を1つだけ削除すると、実際のパフォーマンスの問題になることです。ご覧のとおり、再ハッシュ操作には非常にコストがかかります。

誰かがそれがどのように機能するかを提案してください。これらを管理できる場合は、InitialCapacity、LoadFactor、またはその他の方法を使用して要素を削除してください。

4

2 に答える 2

4

LinkedHashMap最も単純なキャッシュを実装するには適していますが、より高度な要件にはおそらく理想的ではありません。

trueから戻るremoveEldestEntryと、単一の最も古いエントリが削除されます。これを複数の要素に微調整する方法はありません。

たぶん、グアバのような ものがあなたが探しているものかもしれません.CacheBuilder

于 2012-07-26T12:22:20.013 に答える
2

LinkedHashMap は、LRU キャッシュを実装するのに優れているように見えます。リンクされたリストの管理に関して、いくつかのオーバーヘッドがあります

これは、すべての LRU キャッシュに当てはまります。

スレッドセーフではありません

Collections.synchronizedMap() を使用できます

私が持っている質問は、これまでのところ答えが見つからないことです。 removeEldestEntry が実装されていて、リストがいっぱいになっている場合に、LinkedHashMap がリストから削除する要素の数です。

最も古いエントリを削除します。つまり、唯一無二です。

LinkedHashMap のソースから

    if (removeEldestEntry(eldest)) {
        removeEntryForKey(eldest.key);

私の懸念は、新しい要素を配置するために要素を1つだけ削除すると、実際のパフォーマンスの問題になることです。

そうではありません。

ご覧のとおり、再ハッシュ操作には非常にコストがかかります。

再ハッシュは、エントリが削除されたときではなく、容量が大きくなったときにのみ発生します。

于 2012-07-26T12:38:17.627 に答える