我有一个数据结构,如下所示:
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方法达到最大缓存大小会发生什么?
答案 0 :(得分:3)
我认为你不理解使用sizeOf()
方法:
以用户定义的单位返回键和值的条目大小。 默认实现返回1,因此size是数字 条目和最大大小是条目的最大数量。
在特定情况下,可以覆盖此方法,其中存储在缓存中的某些条目的大小明显大于其他条目(这可能在缓存位图时发生)。通过这种方式,您可以根据单位大小而不是条目数指定缓存的最大保留限制。达到此限制后,将删除最近最少使用的条目。
在你的情况下,除非String对象要存储非常长的字符串,否则不需要覆盖它。
如果你坚持要覆盖它,你可以这样做:
protected int sizeOf(String k, Data v) {
return v.charData.length();
}
正如文档所述,返回的大小可以是任何用户定义的单位。所以String.length()
会很好。由于int
的长度与长String
相比无关紧要,因此我将其遗漏了。
基本上,您需要返回一个代表条目相对大小的数字。