2010-08-23 78 views
0

我有这个简单的类POD的Java hashCode?

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林存储实例,但随后倾斜检索。我担心它的实现。当x和y不是对象时,有什么办法可以实现它吗?

在此先感谢

+0

什么是哈希表? – 2010-08-23 03:40:25

+0

那它是什么?缺少等于? – Thilo 2010-08-23 04:13:24

+0

涉及蹩脚平等的糟糕决定的组合。 – Tom 2010-08-23 04:31:53

回答

2

,你不能取回他们无关,与你的hashCode实现。

为整数#的hashCode刚刚返回它的值,你可以把它简化为

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

你把对象插入到地图之后,改变Ix和Iy?这是一个很大的禁忌,并且完全破坏了哈希表。您也需要定义Position#equals

2

我有一个猜测:你是否覆盖了equals方法?在Java中,当你实现一个时,你应该实现另一个。

特别是,如果您使用Position实例作为密钥,HashMap会将它们与equals进行比较。否则,两个键可能会意外地具有相同的散列值,但值不同。

HashMap#get

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

yeap,它在那里。 – Tom 2010-08-23 03:43:18

+0

我不认为在这种情况下重写'equals'方法,因为Object.equals()对于这种情况是可以的:) 我同意Thilo:将对象放入对象后改变ix和iy是错误的地图 – 2010-08-23 03:43:46

+0

+1:可能就是这样。 – Thilo 2010-08-23 03:43:47