簡體   English   中英

如果類具有引用類型成員java,如何實現equality和hashCode方法?

[英]how do you implement the equality and hashCode method if the class has reference type members java?

我正在嘗試實現以下示例,以在類具有引用類型成員但沒有運氣的情況下覆蓋均等和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的哈希碼進行xor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM