代码之家  ›  专栏  ›  技术社区  ›  Tom

吊舱的Java哈希代码?

  •  0
  • Tom  · 技术社区  · 15 年前

    我有这个简单的班

    public class Position{
       int x;
       int y;
    
       Position(int x,int y){...}
    
       public int hashCode(){
        Integer ix = this.x;
        Integer iy = this.y;
    
        return 13*iy.hashCode() + 43*ix.hashCode();
       }
    }
    

    将实例存储在 hashMap 但却无法找回它们。我害怕它 hashcode 实施。当x和y不是对象时,有没有办法实现它?

    提前谢谢

    2 回复  |  直到 15 年前
        1
  •  2
  •   Thilo    15 年前

    无法检索它们与您的哈希代码实现无关。

    由于integer hashcode只返回其值,因此可以将其简化为

     public int hashCode(){
          return 13*iy+43*ix;
     }
    

    将对象放入地图后,是否更改了ix和iy?这是一个巨大的不,完全搞砸了哈希表。

    此外,您还需要定义 Position#equals 也。

        2
  •  2
  •   Nikita Rybak    15 年前

    我猜:你重写了吗? equals 还有方法吗?在Java中,当实现一个时,应该实现另一个。

    尤其是如果你使用 Position 实例作为键, HashMap 将它们与 等于 . 否则,两个键可能意外地具有相同的哈希值,但值不同。

    HashMap#get

    if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;