如果类具有引用类型成员 Java,则如何实现相等和哈希代码方法



如果类有引用类型成员但没有运气,我正在尝试实现以下示例以覆盖相等和哈希代码方法。 任何帮助将不胜感激。提前感谢大家..

     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))); //
    }
}
****

**

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

 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哈希代码,一个简单的选择是生成本地哈希代码并使用点的哈希代码xor它。

最新更新