现在有这么一个类。
public Chest {
  public HashMap<Key, String> map = new HashMap<Key, String>();
  public void test(){
    map.put(new Key(1, 1), "tt");
    System.out.println(map.get(new Key(1, 1));
  }
}public Key() {
  private int x;
  private int y;
  public Key(int x, int y) {
    this.x = x;
    this.y = y;
  }
  public boolean equals(Key k){
    if (x == k.x && y == k.y) {
      return true;
    }esle {
      return false;
    }
  }
  public int hashCode() {
    return (x*7 + y*23);
  }
}为什么new了Chest的实例之后调用test(),返回的总是null呢?总是认为找不到Key对应的Value?

解决方案 »

  1.   

    第一个new Key(1,1)和第二个new Key(1,1)不是同一个引用
    建议将test()方法改成如下试试:
    public void test()
    {
        Key key = new Key(1,1);
        map.put(key,"tt");
        System.out.println(map.get(key);
    }
      

  2.   

    他不是利用equals来判断是否key相同吗?
      

  3.   

    类CLASS都没见到在上面
    public void test(){ 
    Key  key=new Key(1, 1); 
    map.put(key, "tt");
    System.out.println(map.get(key));}这样可以. 
      

  4.   

    Map,Set都建议既重写equals方法,也重写hashcode方法的原因就是怕里面有容器里面有相同的元素,
      

  5.   

    正确的equals方法应该这样写,注意参数。
            @Override
    public boolean equals(Object obj) {
    if(obj instanceof Key){
        Key k =(Key)obj;
        if(x==k.x&&y==k.y)
      return true;
    }
    return false;
    }
      

  6.   

    你的Key需要实现Comparable,尝试一下。
      

  7.   

    import java.util.HashMap;public class Chest {//你的class都没有 public static void main(String[] args) {//主方法
    HashMap<Key, String> map = new HashMap<Key, String>();
    Key key = new Key(1, 1);
    map.put(key, "tt");
    System.out.println(map.get(key));//用new是新创建一个对象,是不同的引用
    }
    }class Key {//这是定义类
    private int x;
    private int y; public Key(int x, int y) {
    this.x = x;
    this.y = y;
    } public boolean equals(Key k) {
    if (x == k.x && y == k.y) {
    return true;
    } else {
    return false;
    }
    } public int hashCode() {
    return (x * 7 + y * 23);
    }
    }这样就可以了,返回结果:tt
      

  8.   

    还是内部实现的问题吧,即使两个对象的hashcode一致,但由于new时生成两个不同的对象,在堆中也分别存放,而且在hashmap的实现中有 int index  = hashcode%table.length进行再次加工了,所以得不到原来的值
    网上应该有介绍的
      

  9.   

    汗,对不起5楼我结成6楼了。楼上大家提出的方法我都试过了,应该是我没有正确覆盖equals(Object o)这个方法,不知道为什么昨天晚上写得equals(Key k),eclipse也提示我覆盖了父类的方法后来也尝试了Object不知道为什么没成功,大概是太晚了,人晕了。这个问题的结论就是:只要正确覆盖equals就可以了