开发者

Create HashMap as cache for objects, problem with key object

I'm new to java, i'm working width android sdk

Im generating a lot of objects which are in 50% te same so i thought that i can implement a simple caching mechanism

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

and the Cach开发者_JAVA技巧ePathKey is :

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

but i've nulls as keys when debugging, and containsKey returning always false

what i'm doing wrong ?


The code you posted can't leads to null keys in the mCachedPaths map. Thus you should look outside from this code to see who is putting these null keys.

You also have to override Equals and HashCode methods in your CachePathKey class using the mPathID and the mZf fields (the fields that makes your object unique). IDE such has eclipse allows you (from contextual menu in Eclipse) to automatically override these methods using end user selected class members.

I also strongly recommend the reading of Chapter9 in Effective Java 2nd edition book.


you need to override equals and hashcode method for CachePathKey,

Since you have unique identified for object do a equal test on mPathID

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜