【问题标题】:Use of equals() method [duplicate]使用equals()方法[重复]
【发布时间】:2013-08-21 11:01:35
【问题描述】:

所以我不确定为什么下面的代码会返回“它们不相等”。从检查它应该返回“他们是平等的”。谁能帮我吗?提前谢谢你。

public class BenAndLiam {
public static void main(String[] args){
    String[] name = new String[2];
    name[0] = "Liam";
    name[1] = "Short";
    int[] marks = new int[3];
    marks[0] = 90;
    marks[1] = 50;
    marks[2] = 70;

    //make students
    Student Liam = new Student(1111, name, marks);
    Student Ben = new Student(1111, name, marks);

    //print Liam's info
    System.out.println(Liam.getId() + " " + Liam.getName()[0] + " " + 
    Liam.getName()[1] + " " + Liam.getMarks()[0] + " " + Liam.getMarks()[1] +
    " " + Liam.getMarks()[2]);
    System.out.println(Ben.getId() + " " + Ben.getName()[0] + " " + 
            Ben.getName()[1] + " " + Ben.getMarks()[0] + " " + Ben.getMarks()[1] +
            " " + Ben.getMarks()[2]);

    //check for equality
    if(Ben.equals(Liam))
        System.out.println("They're equal");
    else System.out.println("They're not equal");
    }
}

我的学生代码:

public class Student {
//The aspects of a student
private int id;
private String name[];
private int marks[];


//Constructor 1

public Student(int id, String name[]){
    this.id = id;
    this.name = name;
}

//Constructor 2
public Student(int id, String name[], int marks[]){
    setId(id);
    setName(name);
    setMarks(marks);
}

//accessor for id
public int getId(){
    return id;
}

//accessor for name
public String getName()[]{
    return name;
}

//accessor for marks
public int getMarks()[]{
    return marks;
}

//Mutator for id
public void setId(int id){
    this.id = id;
}
//mutator for name
public void setName(String name[]){
    this.name = name;
}
//Mutator for marks
public void setMarks(int marks[]){
    this.marks = marks;
}

}

从表面上看,我需要为在我的 Student 类中使用 equals() 设置某种标题?

更新: 我刚刚通过将此代码添加到我的学生类中使其工作:

public boolean equals(Student otherstudent){
    return ((id == otherstudent.id) && (name.equals(otherstudent.name)
            && (marks == otherstudent.marks)));
}

干杯!

【问题讨论】:

  • 你能展示一下student的equals方法吗?你应该重写这个方法并在那里处理你的逻辑。
  • 发布Student 的代码。你定义了equals吗?
  • 您是否记得在您的Student 类中覆盖equals()hashCode()
  • 我刚刚为学生添加了代码。请参阅我的原始帖子。
  • 我成功了!我没有在学生课上描述(这是正确的术语)我的方法。这是我在学生课中输入的代码: public boolean equals(Student otherstudent){ return ((id == othersstudent.id) && (name.equals(otherstudent.name) && (marks == othersstudent.marks))) ;干杯伙计们!

标签: java


【解决方案1】:

您应该覆盖Student 类中的equals() 方法。

请阅读:What issues should be considered when overriding equals and hashCode in Java?

【讨论】:

  • +1 和 hashCode() 保持一致。您可以使用您的 IDE 来生成这些。
【解决方案2】:

默认情况下,Object.equals() 检查两个变量是否指向同一个对象——同一个内存空间中的一个实例。您有两个具有相同数据的不同对象。您需要重写 .equals() 方法来比较对象的内容,而不是默认的比较内存地址的方法。

如果您确实覆盖了equals(),请确保也覆盖hashCode()。阅读Object javadoc 中这两种方法的约定,并确保您遵循它,否则您的程序可能会出现异常,尤其是在您使用 Collections API 时。

【讨论】:

    【解决方案3】:

    obj1.equals(obj2) 在 obj2 引用与 obj1 相同的对象时总是返回 true

        Student obj1=new Student();
        Student obj2= new Student();
    
        obj1.setId(45);
        obj1.setName("obj1 Name");
        obj1.setFatherName("obj1's father");
    
        obj2.setId(45);
        obj2.setName("obj1 Name");
        obj2.setFatherName("obj1's father");
    
        System.out.println(obj1.equals(obj2));
    

    总是会返回 false 因为 obj1 和 obj2 是 Class Student 的新对象,虽然两个对象的值相同,但是内存引用不同。

    与我上面的说法相反,

        Student obj1=new Student();
        Student obj2= obj1;
    
        obj1.setId(45);
        obj1.setName("obj1 Name");
        obj1.setFatherName("obj1's father");
    
        obj2.setId(46);
        obj2.setName("obj2 Name");
        obj2.setFatherName("obj2's father");
    
        System.out.println(obj1.equals(obj2));
    

    将返回 true,因为 obj2 实际上是在引用 obj1 的对象,尽管在这种情况下值是不同的。因此,没有分配给 obj2 的新内存位置,因此它将返回 true。

    【讨论】:

      【解决方案4】:

      如果两个引用指向同一个对象,Java 将考虑 Equals

      要比较字符串,可以使用 String 类中的 equalsIgnoreCase() 方法。

      【讨论】:

        【解决方案5】:

        运算符 == 测试两个对象引用变量是否引用了完全相同的对象实例。

        方法 .equals() 测试被比较的两个对象是否相等——但它们不必是同一对象的完全相同的实例。

        Student Liam = new Student(1111, name, marks);
        Student Ben = new Student(1111, name, marks);
        

        在上面的代码中,Liam == Ben 是假的,因为尽管它们都有值 1111、name、marks,但它们是两个不同的对象。

        另外,在上面的代码中,Liam .equals(Ben) 是正确的,因为虽然它们是两个不同的对象,但它们是等价的,因为它们代表相同的值。

        【讨论】:

        • 不,它默认检查引用相等性。
        • 方法 .equals() 测试被比较的两个对象是否相等——但它们不必是同一对象的完全相同的实例。
        • 这并没有改变 default 操作是引用相等的事实,而不是这个答案的原始版本中的“字符串值相等”。而且您的答案仍然是错误的,或者说是误导性的:直到为Student((Liam == Ben) == Liam.equals(Ben)) == false 实施equals()
        猜你喜欢
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 2012-03-08
        相关资源
        最近更新 更多