所以我不确定为什么以下代码返回“它们不相等”。从检查中它应该返回“他们是平等的”。谁能帮我吗?提前谢谢。
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()?
更新: 我只是通过将此代码添加到我的Student类中来实现它:
public boolean equals(Student otherstudent){
return ((id == otherstudent.id) && (name.equals(otherstudent.name)
&& (marks == otherstudent.marks)));
}
干杯!
答案 0 :(得分:7)
您应该覆盖equals()
课程中的Student
方法。
请注意:What issues should be considered when overriding equals and hashCode in Java?
答案 1 :(得分:5)
默认情况下,Object.equals()
检查两个变量是否指向同一个对象 - 同一个内存空间中的一个实例。您有两个具有相同数据的不同对象。您需要覆盖.equals()
方法,以便将对象的内容相互比较,而不是默认值,后者会比较内存地址。
如果您覆盖equals()
,请务必覆盖hashCode()
。阅读Object
javadoc中两种方法的合同,并确保遵循它,否则您的程序可能会出错,尤其是在使用Collections API时。
答案 2 :(得分:0)
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。
答案 3 :(得分:-1)
如果两个引用指向同一个对象,Java将考虑Equals
。
要比较字符串,可以使用String类中的方法equalsIgnoreCase()
。
答案 4 :(得分:-5)
运算符==,测试两个对象引用变量是否引用对象的完全相同的实例。
方法.equals(),测试两个对象是否相互比较 - 但它们不必是同一对象的完全相同的实例。
Student Liam = new Student(1111, name, marks);
Student Ben = new Student(1111, name, marks);
在上面的代码中,Liam == Ben是假的,因为虽然它们都有值1111,name,marks,但它们是两个不同的对象。
此外,在上面的代码中,Liam .equals(Ben)是正确的,因为虽然它们是两个不同的对象,但它们相当于它们代表相同的值。