0

我有一个数据结构,如下所示:

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

  //get-set methods here
}

现在,我想创建一个 lru 缓存,我需要覆盖 sizeof...因为 java 中的每个 char 占用 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,因此 size 是条目数,而 max size 是最大条目数。

在缓存中存储的某些条目的大小明显大于其他条目的特定情况下,可以覆盖此方法(缓存位图时可能会发生这种情况)。通过这种方式,您可以根据您的大小单位而不是条目数来指定缓存保留的最大限制。达到此限制后,将逐出最近最少使用的条目。

在您的情况下,不需要覆盖它,除非 String 对象将存储极长的字符串。

如果你坚持要覆盖它,你可以这样做:

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

正如文档所说,返回的大小可以是任何用户定义的单位。所以String.length()会做得很好。由于 s 的大小int与 long s 相比微不足道String,因此我将其省略了。

基本上,您需要返回一个表示条目相对大小的数字。

于 2012-09-09T12:09:18.750 回答