2012-09-09 46 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

更新了我的答案。 –