2011-08-03 30 views
0

我是新來的Java,我的工作寬度Android SDK中創建的HashMap作爲高速緩存的對象,問題的關鍵對象

進出口產生了很多這是在50%TE同一對象的,所以我認爲我可以實現簡單的緩存機制

private HashMap<CachePathKey, Path> mCachedPaths; 



public Path GenerateRealPath(final Sprite pSprite,final int pStartIndex){ 

    CachePathKey mCachedKey = new CachePathKey(mPathID, pStartIndex, MyGame.mCamera.getZoomFactor(), pSprite.getWidth(), pSprite.getHeight()); 

    if (!mCachedPaths.containsKey(mCachedKey)){ 
     //generate Path Object to p 
     mCachedPaths.put(mCachedKey,p); 
     return p; 
    } else { 
     return mCachedPaths.get(mCachedKey); 
    } 

和CachePathKey是:

class CachePathKey { 
private int mPathID; 
private int mStartIndex; 
private float mZF; 
private float mWidthSprite; 
private float mHeightSprite; 
public CachePathKey(int pPathID, int pStartIndex, float pZf, 
     float pWidthSprite, float pHeightSprite) { 
    this.mPathID =pPathID; 
    this.mStartIndex = pStartIndex; 
    this.mZF = pZf; 
    this.mWidthSprite = pWidthSprite; 
    this.mHeightSprite = pHeightSprite; 
} 
} 

,但我已經爲空值密鑰時調試,並在返回的containsKey總是假

我做錯了什麼?

回答

1

您發佈的代碼不能導致null鍵在mCachedPaths地圖。因此,您應該從該代碼的外部查看誰將這些空鍵。

您還必須使用mPathID和mZf字段(使對象唯一的字段)覆蓋CachePathKey類中的EqualsHashCode方法。 IDE(如Eclipse)允許您(使用Eclipse中的上下文菜單)使用最終用戶選擇的類成員自動覆蓋這些方法。

我也強烈推薦閱讀Chapter9 in Effective Java 2nd edition這本書。

1

你需要重載equals和CachePathKey hashCode方法,

既然你唯一確定了對象做一個平等的測試上mPathID

+0

所有這些都是唯一的,一個可以有(mPathID = 1,mZF = 1)或(mPathID = 1,mZF = 0.9f) –

+0

你需要唯一地識別你的物體什麼情況你做什麼 –

+0

作品像魅力!謝謝 –