3

JavaでLRUキャッシュを実装するための標準的な例は、デポURLの例を示してい ますhttp://www.exampledepot.com/egs/java.util/coll_Cache.html

以下のコードスニペットに新しいエントリを追加した後、デフォルトでremoveEldestEntryはどのように呼び出されますか?

final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
    // This method is called just after a new entry has been added
    public boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
    }
};

// Add to cache
Object key = "key";
cache.put(key, object);

// Get object
Object o = cache.get(key);
if (o == null && !cache.containsKey(key)) {
    // Object not in cache. If null is not a possible value in the cache,
    // the call to cache.contains(key) is not needed
}

// If the cache is to be used by multiple threads,
// the cache must be wrapped with code to synchronize the methods
cache = (Map)Collections.synchronizedMap(cache);
4

3 に答える 3

2

Java APIにLinkedHashMapよると:

removeEldestEntry(Map.Entry)新しいマッピングがマップに追加されたときに、古いマッピングを自動的に削除するためのポリシーを課すために、メソッドがオーバーライドされる場合があります。

具体的には:

putこのメソッドは、マップに新しいエントリをputAll挿入することによって呼び出されます。

また注意してください:

このメソッドは通常、マップを変更せず、代わりに、戻り値の指示に従ってマップ自体を変更できるようにします。このメソッドでマップを直接変更することは許可されていますが、変更する場合はfalseを返す必要があります(マップがそれ以上の変更を試みてはならないことを示します)。このメソッド内からマップを変更した後にtrueを返す効果は指定されていません。

于 2009-08-04T20:34:47.360 に答える
1

この例では、は「匿名内部クラス」LinkedHashMapで拡張されています。

このremoveEldestEntryメソッドは、常に返されるスーパークラスのバージョンをオーバーライドしますfalse(最も古いエントリを削除しないことを示します)。trueマップのサイズが制限を超えると、オーバーライドバージョンが返され、最も古いエントリを削除する必要があることを示します。

于 2009-08-04T20:36:22.600 に答える
0

LinkedHashMapクラスのドキュメントには、適切なタイミングでメソッドremoveEldestEntry()が呼び出されると記載されています。上記のコードでは、LinkedHashMapクラスの匿名の「拡張機能」を提供し、そのメソッドの実装を明示的に提供します。

于 2009-08-04T20:38:14.420 に答える