2012-09-09 38 views
0

我有一个数据结构,像这样:如何计算Lrucache的sizeof?

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方法达到最大缓存大小会发生什么情况?

回答

3

我想你不明白使用sizeOf()方法:

返回用户自定义单位为键和值条目的大小。 默认实现返回1,以便大小是 条目的数量,最大大小是条目的最大数量。

该方法可在某些条目存储在高速缓存中的尺寸比其它的更大显著(这可以缓存位图时发生)特定情况下被覆盖。通过这种方式,您可以根据大小单位而不是条目数指定缓存的最大限制数。一旦达到此限制,最近最少使用的条目将被驱逐。

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

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

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

由于文件说,返回的大小可以是用户定义的任何单元。所以String.length()会很好。由于int的大小与长的String相比是微不足道的,所以我将它排除在外。

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

+0

是的它是:我不知道“极端”对你意味着什么,但字符串字段可以从200到700-1000个字符(它们是文章)变化。那么,我需要它吗?在这种情况下,我的实施可以吗? – Phate

+0

更新了我的答案。 –