gpt4 book ai didi

java - 如果类有引用类型成员java,如何实现 equal 和 hashCode 方法?

转载 作者:行者123 更新时间:2023-12-01 17:00:28 24 4
gpt4 key购买 nike

如果类具有引用类型成员但没有运气,我尝试实现以下示例来重写相等和 hashCode 方法。任何帮助将不胜感激。提前谢谢大家..

     class Point{
private int x, y;
Point (int x, int y)
{
this.x =x;
this.y = y;
}

}


class Circle
{
int radius;
Point point ;

Circle(int x, int y, int radius)
{
point = new Point (x ,y);
this.radius = radius;
}



@Override
public boolean equals(Object arg) {

if(arg == null) return false;
if(arg == this) return true;
if(arg instanceof Circle)
{
if(this.point ==((Circle) arg).point && this.radius == ((Circle) arg).radius)
{
return true;
}

}


return false;
}

@Override
public int hashCode() {

return point.hashCode() ^ this.radius;
}

}


public class TestClass{

public static void main(String args[])
{
Set<Circle> circle = new HashSet<> ();
circle.add(new Circle(10,20,40));

System.out.println(circle.contains(new Circle(10,20,40))); //
}

}

****************************编辑版本,由 Alnitak 建议**************** **

现在我确实得到了相等对象的预期结果“true”和不相等对象的预期结果“false”。但是当对象值不相等时,Circle 的 equal 方法中的 print 语句不会被执行。我不知道我错过了什么,尽管我得到了非相等对象预期的相等结果“false”。

 class Point{
private int x, y;
Point (int x, int y)
{
this.x =x;
this.y = y;
}
@Override
public boolean equals(Object arg) {
if(arg == null ) return false;
if(arg== this) return true;
if(arg instanceof Point)
{
Point p = (Point) arg;
if(p.x == x && p.y == y )
{
return true;
}
}
return false;

}
@Override
public int hashCode() {

return (this.x*1124739) ^ (this.y*95);
}

}


class Circle
{
int radius;
Point point ;

Circle(int x, int y, int radius)
{

System.out.println("Circle object created x= " + x);
point = new Point (x ,y);
this.radius = radius;
}



@Override
public boolean equals(Object arg) {

if(arg == null) return false;
if(arg == this) return true;
if(arg instanceof Circle)
{
System.out.println("checking circles objects for equality ");
// Doesn't get printed when circle objects values are not equal

Circle c = (Circle) arg;
return (point.equals(c.point) && radius == c.radius);

}


return false;
}

@Override
public int hashCode() {

return point.hashCode() ^ this.radius *37;
}

}


public class TestClass{

public static void main(String args[])
{
Set<Circle> circle = new HashSet<> ();
circle.add(new Circle(10,20,40));

System.out.println(circle.contains(new Circle(11,20,40))); //
}

}

最佳答案

您现有的Circle.equals()方法仅检查引用相等性,而不检查值相等性。它总是会失败,因为每个Circle都包含一个新构造的Point对象,该对象对于该实例是唯一的。

您应该为 Point 类创建适当的 hashCodeequals 方法。

Circle类中,您可以使用Point.equals()来检查所保存引用的值是否相等,例如:

public boolean equals(Object arg) {
if (arg == null) return false;
if (arg == this) return true;
if (arg instanceof Circle) {
Circle c = (Circle)arg;
return radius == c.radius && point.equals(c.point);
}
return false;
}

对于Circle哈希码,一个简单的选择是生成本地哈希码并将其与Point的哈希码异或

关于java - 如果类有引用类型成员java,如何实现 equal 和 hashCode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27944852/

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