0

次のようなデータ構造があります。

public class Data{
  private String charData;
  private int intData;

  //get-set methods here
}

今、私はlruキャッシュを作成したいので、sizeofをオーバーライドする必要があります.Javaの各文字は2バイトを占有しますが、intは4バイトですが、次のように作成します:

cachedData= new LruCache<String,Data>(CACHE_MB*1024*1024){
    protected int sizeOf(String k,Data v){ 
                 return 4 +2*v.getCharData().length();
 }

ただし、文字列はオブジェクトであるため、文字のメモリだけでなく、さらにデータもオブジェクトであるため、私の方法が正しいかどうかはわかりません。

ところで、間違った sizeOf メソッドで最大キャッシュ サイズに達するとどうなりますか?

4

1 に答える 1

3

メソッドの使用法を理解していないと思いますsizeOf()

キーと値のエントリのサイズをユーザー定義の単位で返します。デフォルトの実装では 1 が返されるため、サイズはエントリ数、最大サイズはエントリの最大数になります。

このメソッドは、キャッシュに保存されている特定のエントリのサイズが他のエントリよりも大幅に大きい場合にオーバーライドできます (これは、ビットマップのキャッシュ時に発生する可能性があります)。このようにして、エントリの数ではなく、サイズの単位でキャッシュが保持する最大制限を指定できます。この制限に達すると、最も使用頻度の低いエントリが削除されます。

あなたの場合、 String オブジェクトが非常に長い文字列を格納しない限り、それをオーバーライドする必要はありません。

どうしてもオーバーライドしたい場合は、次のようにします。

protected int sizeOf(String k, Data v) {
    return v.charData.length();
}

ドキュメントにあるように、返されるサイズは任意のユーザー定義の単位にすることができます。だからString.length()うまくいくでしょう。のサイズはintロングSに比べると微々たるものなので省きStringました。

基本的に、エントリの相対的なサイズを表す数値を返す必要があります。

于 2012-09-09T12:09:18.750 に答える