Java 创建HashMap作为对象的缓存,密钥对象有问题

Java 创建HashMap作为对象的缓存,密钥对象有问题,java,hashmap,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,

我是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);
    }
但我在调试时使用null作为键,并且containsKey总是返回false


我做错了什么

您需要为CachePathKey重写equals和hashcode方法


由于您具有唯一的标识对象,请对
mPathID

进行同等测试,因此您发布的代码不会导致
mCachedPaths
映射中的
null
键。因此,您应该从代码中向外看,看看是谁在放置这些空键

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


我还强烈建议大家阅读这本书。

所有这些都是独一无二的,一个可以有(mPathID=1,mZF=1)或(mPathID=1,mZF=0.9f)你需要唯一地识别你的对象,你所做的任何条件都有一个时间限制,在此之前你不能接受答案
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;
}
}