2013-08-21 3 views
-4

Так что я не уверен, почему следующий код возвращает «Они не равны». Из проверки он должен вернуться «Они равны». Может кто-нибудь мне помочь? Заранее спасибо.Использование метода equals()

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?

UPDATE: Я только что получил это работает, добавив этот код в моем классе Student:

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

Приветствия ребята!

+2

Можете ли вы показать метод равных учеников? Вы должны переопределить этот метод и обработать свою логику там. – Tobrun

+0

Отправьте свой код для 'Student'. Вы определили 'equals'? – chrylis

+1

Помните ли вы переопределить 'equals()' и 'hashCode()' в классе 'Student'? –

ответ

-5

Оператор == проверяет, ссылаются ли две ссылочные переменные объекта на один и тот же экземпляр объекта.

Метод, .equals(), проверяет, эквивалентны ли эти два объекта друг другу, но они не обязательно должны быть одним и тем же экземпляром одного и того же объекта.

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

В приведенном выше коде, Лиам == Бен является ложным, потому что, хотя они оба имеют значение 1111, имя, знаки, они являются двумя разными объектами.

Кроме того, в приведенном выше коде Liam .equals (Ben) истинно, потому что, хотя это два разных объекта, они эквивалентны тому, что они представляют одно и то же значение.

+0

Нет, он проверяет ссылочное равенство по умолчанию. –

+0

Метод, .equals(), проверяет, эквивалентны ли эти два объекта друг другу, но они не обязательно должны быть одним и тем же экземпляром одного и того же объекта. –

+0

Это не меняет того факта, что операция ** default ** является ссылочным равенством, а не «эквивалентом строковых значений», как в исходной ревизии этого ответа. И ваш ответ по-прежнему ошибочен или, скорее, вводит в заблуждение: до 'equals()' реализовано для 'Student',' ((Liam == Ben) == Liam.equals (Ben)) == false'. –

-1

Java рассмотрит Equals, если две ссылки указывают на тот же объект.

Чтобы сравнить строки, вы можете использовать метод equalsIgnoreCase() из класса String.

5

По умолчанию Object.equals() проверяет, указывают ли две переменные на один и тот же объект - один экземпляр в том же пространстве памяти. У вас есть два разных объекта с одинаковыми данными. Вам необходимо переопределить метод .equals() для сравнения содержимого объектов друг с другом, а не по умолчанию, который сравнивает адреса памяти.

Если вы делаете переопределение equals(), обязательно закройте hashCode(). Прочитайте контракты для обоих методов в javaadoc Object и убедитесь, что вы следуете им, или ваши программы, вероятно, будут плохо себя вести, особенно если вы используете API коллекций.

0

obj1.equals (obj2) всегда возвращает true, когда obj2 ссылается на тот же объект, что и obj1.

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

всегда будет возвращать ложь потому obj1 и obj2 новые объекты класса 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)); 

возвратит истинное потому что obj2 на самом деле со ссылкой на объекте obj1, хотя в этом случае значение различно. Таким образом, никакое новое место памяти, выделенное для obj2, и, следовательно, оно вернет true.

Смежные вопросы