LRUCacheについての公式のAndroidドキュメントをチェックアウトしました。値にアクセスするたびに、キューの先頭に移動されます。値がフル・キャッシュに追加されると、そのキューの最後の値は追い出され、ガベージ・コレクションの対象となる可能性があります。 これはキャッシュによって使用されるlinkedhashmapによって維持される二重リンクリストであるとします。この動作を確認するには、LruCacheのソースコードをチェックアウトし、get(Kキー)メソッドをチェックしました。さらに、マップのgetメソッドを呼び出して、基になるハッシュマップから値を取得し、recordAccessメソッドを呼び出します。順番にgetを使用したときのLRUCacheエントリの並べ替え
public V get(Object key) {
LinkedHashMapEntry<K,V> e = (LinkedHashMapEntry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}
recordAccess方法がaccessOrderがtrueに設定されている場合には、リストの最後にアクセスされたエントリを移動し、他のことは何もしない、(私の問題のためのそれであると仮定しましょう)。
/**
* This method is invoked by the superclass whenever the value
* of a pre-existing entry is read by Map.get or modified by Map.set.
* If the enclosing Map is access-ordered, it moves the entry
* to the end of the list; otherwise, it does nothing.
*/
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
if (lm.accessOrder) {
lm.modCount++;
remove();
addBefore(lm.header);
}
}
これは、要素がキューの先頭に移動したという上記のステートメントと矛盾しています。代わりに、リストの最後の要素に移動します(head.beforeを使用)。確かに、私はここに何かを逃しています、どんな助け? LinkedHashMap
のjavadocツールから
私はあなたがチェックしているソースする何見当がつかない、私は唯一の[この](https://android.googlesource.com/platform/frameworks/support.git/+/795b97d901e1793dac5c3e67d43c96a758fec388/v4/java/android/support見ることができます/v4/util/LruCache.java#63) – pskink
同じソースをチェックしていますが、実際の並べ替えはLinkedHashMapクラスで行われます(これはリストが維持されるためです)。map.get ) 方法。 –
OK、 '' LinkedHashMap'の実装の詳細ではなく、いくつかの仮想 ''キュー ''を参照します(マッピングは逆になります) – pskink