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

}

見たところ、Student クラスで equals() を使用するには、ある種の見出しが必要ですか?

更新:このコードを Student クラスに追加することで、機能するようになりました。

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()は、2 つの変数が同じオブジェクト (同じメモリ空間内の 1 つのインスタンス) を指しているかどうかをチェックします。同じデータを持つ 2 つの異なるオブジェクトがあります。.equals()メモリ アドレスを比較するデフォルトではなく、オブジェクトの内容を相互に比較するには、メソッドをオーバーライドする必要があります。

オーバーライドする場合はequals()、必ずオーバーライドも行ってくださいhashCode()。javadocで両方のメソッドの契約を読み、Objectそれに従っていることを確認してください。そうしないと、特に Collections API を使用する場合に、プログラムが誤動作する可能性があります。

于 2013-08-21T11:04:51.993 に答える
-1

Java はEquals、2 つの参照が同じオブジェクトを指しているかどうかを考慮します。

equalsIgnoreCase()文字列を比較するには、String クラスのメソッドを使用できます。

于 2013-08-21T11:03:36.700 に答える
-5

演算子 == は、2 つのオブジェクト参照変数がオブジェクトのまったく同じインスタンスを参照しているかどうかをテストします。

メソッド .equals() は、比較対象の 2 つのオブジェクトが等しいかどうかをテストしますが、同じオブジェクトのまったく同じインスタンスである必要はありません。

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

上記のコードでは、Liam == Ben は false です。どちらも 1111、name、marks という値を持っていますが、2 つの異なるオブジェクトであるためです。

また、上記のコードでは、Liam .equals(Ben) は true です。これらは 2 つの異なるオブジェクトですが、同じ値を表すという点で同等だからです。

于 2013-08-21T11:03:03.547 に答える