gpt4 book ai didi

java - 比较 HashSet 中的对象

转载 作者:行者123 更新时间:2023-12-01 19:45:48 25 4
gpt4 key购买 nike

我正在制作一款有星星的 2D 游戏。我决定在名为 Star 的类中创建给出随机坐标的构造函数。

public Star(){
super(0,0);
x = randomX.nextInt(maxX - minX + 1);
y = randomY.nextInt(maxX - minY + 1);
}

然后,在其他类(class)中我将它们放入 HashSet

Set<Star> star = new HashSet<>();

public Set<Star> generateStars(){
while (star.size() < numberOfStars){
star.add(new Star());
}
return star;
}

当然,我有渲染和勾选方法,但我认为不值得粘贴它们。我的讲师告诉我,可以有相同的星星,为了防止我应该使用使用哈希码的身份函数。有人可以帮我解决这个问题吗?我想这个函数应该检查哈希码是否相同,如果是这样,它应该只返回一个值,这样我们就可以将 1 个对象而不是 2 个对象添加到 HashSet 中。我说得对吗?

最佳答案

Star 类中单独重写 hashCode() 方法是行不通的,您必须重写 equals() 方法。

请参阅以下代码,其中我们没有重写 equals() 方法:

class Star {
int x, y;

public Star(int x, int y) {
this.x = x;
this.y = y;
}

@Override
public int hashCode() {
return Objects.hash(x, y);
}
}

public class Main {
public static void main(String[] args) {
Star s1 = new Star(0, 0);
Star s3 = new Star(0, 0);
Star s2 = new Star(31, -31*31);
Set<Star> set = new HashSet<>();
set.add(s1);
set.add(s2);
System.out.println(set.size());
}
}

这将打印 3(而不是您可能期望的 2)。

原因是 java.util.Set 的 add 方法基于 equals() 方法比较 2 个对象,而不是基于 hashCode( ) 方法。

在上述 Star 类的代码中,如果添加 equals() 方法,则输出现在将为 2。作为引用,您可以重写 equals() 方法,如下所示:

@Override
public boolean equals(Object startObject) {
if (this == startObject) return true;
if (startObject == null || getClass() != startObject.getClass()) return false;
Star star = (Star) startObject;
return x == star.x &&
y == star.y;
}

那么为什么需要添加hashCode()

  1. 当您使用 HashSet 时,后台的 add 方法将调用 equals() 方法,并且还将调用 hashCode()决定新对象应放置在哪个桶中。为了维护 hashCode()equals() 的契约,两者都应该被重写。
  2. 当您重写equals()时,建议也重写hashCode()。 (反之亦然)。请参阅this链接了解详细信息。

hashCode()equals() 的合约:如果对于两个对象来说 o1o2, o1.equals(o2)true,则为 o1o2 的哈希 应该相同。

请确保您正确理解这一点,从上面的语句来看,并不意味着如果两个对象的哈希值相同,则 o1.equals(o2) 应返回 true对于 2 个对象,它们的哈希值可能相同,但 o1.equals(o2) 返回 false

参见hereObjecthashCode() 方法保证了什么。

参见this链接以获取有关此主题的更多详细信息。

关于java - 比较 HashSet 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53438370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com