1.LRUとは何ですか
LRU (最も最近使用されていない) は、最も頻繁に使用されていないキャッシュ アイテムを削除して、より一般的に使用されるキャッシュアイテム用のスペースを確保するという基本的な考え方を持つキャッシュ アルゴリズムです。
実際のアプリケーションでは、LRU アルゴリズムはキャッシュとページ置換に広く使用されています。
2. Java は LRU キャッシュ アルゴリズムを実装します
Java では、LinkedHashMap を使用して LRU キャッシュ アルゴリズムを実装できます。
LinkedHashMap は HashMap のサブクラスで、要素の順序を維持するために内部で二重リンク リストを使用します。
具体的な実装アイデアは次のとおりです。
- LinkedHashMap を継承して、removeEldestEntry メソッドを書き換えます。このメソッドは、最も古いキャッシュ エントリを削除する必要があることを示す true を返します。
- 構築メソッドで accessOrder を true に指定すると、要素にアクセスするときに要素がリンク リストの最後に移動され、その後の検索と削除に便利です。
- キャッシュ項目にアクセスするときは、get メソッドを使用して要素を取得し、removeEldestEntry メソッドを使用して最も古いキャッシュ項目を削除する必要があるかどうかを判断します。
- キャッシュ項目を追加する場合は、put メソッドを使用して要素を LinkedHashMap に追加します。
LinkedHashMap を使用して LRU キャッシュ アルゴリズムを実装するサンプル コードは次のとおりです。
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
public static void main(String[] args) {
LRUCache<Integer, String> cache = new LRUCache<>(3);
cache.put(1, "one");
cache.put(2, "two");
cache.put(3, "three");
System.out.println(cache); // {1=one, 2=two, 3=three}
cache.get(2);
System.out.println(cache); // {1=one, 3=three, 2=two}
cache.put(4, "four");
System.out.println(cache); // {3=three, 2=two, 4=four}
}
}
上記のサンプル コードでは、LRUCache クラスを作成し、LinkedHashMap を継承し、構築メソッドで accessOrder を true に指定しました。
RemoveEldestEntry メソッドでは、キャッシュ エントリの数が容量を超えると、最も古いキャッシュ エントリを削除する必要があることを示す true が返されます。
キャッシュアイテムにアクセスする場合は、getメソッドを使用して要素を取得します。キャッシュアイテムの数が容量を超えると、最も古いキャッシュアイテムが削除されます。
キャッシュ項目を追加する場合は、put メソッドを使用して要素を LinkedHashMap に追加します。
最後に、メイン メソッドでキャッシュがテストされます。
LinkedHashMap を使用して LRU キャッシュを実装する場合、accessOrder を true に指定する必要があることに注意してください。そうでない場合、LinkedHashMap はアクセス順序ではなく挿入順序に従って要素の順序を維持します。