如何在Java中检查两个对象是否相等?

问题描述

嗨,我是java类的新手,我正在尝试比较两个对象。在这种情况下,圆由一个点和一个半径组成。我需要检查点和半径是否相等,但是在我的代码中,即使它们实际上相等,结果也“不相等”。对不起,如果我的问题很愚蠢。我一直在寻找答案,但仍然无法理解问题:\

public class Circle{
private MyPoint point;
private float radius;
public Circle(){
    MyPoint temp = new MyPoint(0,0);
        point = temp;
        radius = 0;
    }

public Circle(MyPoint Center,float Radius){
    point = Center;
    radius = Radius;
}
public Circle(int x,int y,float Radius){
        MyPoint temp = new MyPoint(x,y);
        point = temp;
        radius = Radius;
}
public void seTradius(float Radius){
    radius = Radius;
}
public void setCenter(int x,int y){
        MyPoint temp = new MyPoint(x,y);
        point = temp;
}
public MyPoint getCenter(){
        return point;
}
public float geTradius(){
    return radius;
}
public boolean equals(Object obj){
            boolean ans = false;
            if(obj instanceof Circle){
                Circle circ = (Circle)obj;
                if(radius == (circ.radius) && point.equals( circ.point ) )
                    ans = true;
            }
            return ans;
}
public static void main(String args[]){
        Circle C1 = new Circle(10,20,5);
        Circle C2 = new Circle(10,5);
        if(C1.equals(C2))
            System.out.println("Equal");
        else
            System.out.println("Not Equal");

 }

在MyPoint类的内部

public class MyPoint{
 private int x;
 private int y;
 public MyPoint(){}
 public MyPoint(int x,int y){
     this.x = x;
     this.y = y;
 }
 public String toString(){
     return "("+x+","+y+")";
 }
}

解决方法

您的MyPoint类没有equals方法,这意味着new MyPoint(1,2)不等于new MyPoint(1,2)(尝试!)。

而且,由于您的Circle的equals定义取决于MyPoint的equals定义才能起作用-发生这种情况。

作为将来的参考,您可以使用lombok的@Data@Value来自动执行这些操作-或者,您的IDE可以为您生成它(但是这种情况很丑陋,您必须记得随时进行更新您可以修改/添加/删除字段),并且在java15中,Point可能会成为一条记录,这也将消除为它显式编写equals代码的需要。

,

正如其他人指出的那样,您尚未为equals()定义MyPoint方法:

这里是一个。

public boolean equals(Object obj){
       if(!(obj instanceof MyPoint)){
        return false;
       }
       MyPoint that=(MyPoint)obj;
       return (this.x==that.x && this.y==that.y);
   }

(隐式)使用Object.equals()张贴代码,如果a和b引用相同的对象,则a.equalis(b)为true。不是你想要的。

优良作法是,如果您覆盖equals(),则应该覆盖hashCode()。 如果不是这样的话,有一天您可能会在Circles中放一些HashMap并得到不愉快的惊喜。 暂时不必担心,但是请注意它是否会出现。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...