如何计算Lrucache的sizeof?

时间:2012-09-09 09:06:46

标签: android

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

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();
 }

但是字符串是对象,所以我认为它们不仅仅是字符的内存,而且Data也是一个对象,所以我不确定我的方法是否正确。

顺便说一下,如果我使用错误的sizeOf方法达到最大缓存大小会发生什么?

1 个答案:

答案 0 :(得分:3)

我认为你不理解使用sizeOf()方法:

  

用户定义的单位返回键和值的条目大小。   默认实现返回1,因此size是数字   条目和最大大小是条目的最大数量。

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

在你的情况下,除非String对象要存储非常长的字符串,否则不需要覆盖它。

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

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

正如文档所述,返回的大小可以是任何用户定义的单位。所以String.length()会很好。由于int的长度与长String相比无关紧要,因此我将其遗漏了。

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