-4

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

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;
}

}

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

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

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

干杯伙计们!

4

5 回答 5

7

您应该重写类中的equals() 方法Student

请优先阅读:Java 中重写 equals 和 hashCode 时应考虑哪些问题?

于 2013-08-21T11:03:11.553 回答
5

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

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

于 2013-08-21T11:04:51.993 回答
0

当 obj2 引用与 obj1 相同的对象时,obj1.equals(obj2) 总是返回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。

于 2013-08-21T11:42:31.107 回答
-1

Java 会考虑Equals两个引用是否指向同一个对象。

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

于 2013-08-21T11:03:36.700 回答
-5

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

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

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

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

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

于 2013-08-21T11:03:03.547 回答