我正在使用==和equals()方法比较相同的对象,但是它们都失败了。我尝试了以下四种组合。请有人指导我犯错了。
public class Question {
int rollNo;
String name;
Question(int rollNo, String name) {
this.rollNo = new Integer(rollNo);
this.name = new String(name);
}
public int getRollNo() {
return new Integer(rollNo);
}
public void setRollNo(int rollNo) {
if(rollNo>0) this.rollNo = rollNo;
}
public String getName() {
return new String(name);
}
public void setName(String name) {
if(name!=null) this.name = name;
}
public static void main(String[] args) {
Question obj1 = new Question(123, "Student1");
Question obj2 = new Question(123, "Student1");
Question obj3 = new Question(456, "Student2");
// All if conditions are evaluating to false
if(obj1 == obj2) System.out.println("Equal objects 1 and 2 using ==");
if(obj1.equals(obj2)) System.out.println("Equal objects 1 and 2 using equals()");
if(obj1 == new Question(123, "Student1")) System.out.println("Equal objects 1 and 2 using == and new");
if((new Question(123, "Student1")).equals(obj2)) System.out.println("Equal objects 1 and 2 using equals() and new");
}
}
我也欢迎就我的代码质量提出建议,因为我刚刚开始编码。
您的对象obj1和obj2可能被称为相似对象,因为每个实例变量的值都相同,但它们并不相等。这些对象中的每一个都在堆内存上并具有唯一的标识符(您可以在IDE的调试模式下检查该ID(Eclipse,Intellij等))。
1.为什么'=='在您的情况下为假
在所有使用'=='运算符的if语句中,将检查引用,并且在每种情况下,引用都是针对不同的对象的(如上所述),因此您的条件为false。
2.为什么equals()在您的情况下也返回false
在剩下的if语句中,您基本上使用的是equals()的默认实现,其中编译器对照此关键字(您在其上调用equals方法的引用)检查对象。因此,它的行为就像'==',并且出于相同的原因返回false。
有什么可以克服的呢?
我假设您的用例要求对象的实例变量值相同时,将它们视为相等,因此您必须通过覆盖equals方法来实现此逻辑。每当您想比较自定义对象时,强烈建议您重写equals()和hashCode()方法(因为相等的对象应生成相同的哈希码,因此您需要在代码中适当地加以注意)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句