创建HashMap作为对象的缓存,关键对象的问题

时间:2011-08-03 10:37:55

标签: java hashmap

我是java的新手,我的工作范围是android sdk

我生成了很多50%相同的对象,所以我认为我可以实现一个简单的缓存机制

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返回始终为false

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你需要覆盖CachePathKey的equals和hashcode方法,

由于您具有针对对象的唯一标识,因此在mPathID

上执行相同的测试

答案 1 :(得分:1)

您发布的代码无法导致null地图中的mCachedPaths个密钥。因此,您应该从此代码中查看,以查看谁将这些空键设置为。

您还必须使用mPathID和mZf字段(使您的对象唯一的字段)覆盖CachePathKey类中的EqualsHashCode方法。 IDE这样的eclipse允许你(从Eclipse中的上下文菜单)使用最终用户选择的类成员自动覆盖这些方法。

我还强烈推荐阅读Chapter9 in Effective Java 2nd edition本书。