为什么Java对象比较都无法通过'=='和.equals()方法进行?

尼哈尔·辛格(Nihaal Singh):

我正在使用==和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");        
}

}

我也欢迎就我的代码质量提出建议,因为我刚刚开始编码。

沙拉德·南达(Sharad Nanda):

您的对象obj1和obj2可能被称为相似对象,因为每个实例变量的值都相同,但它们并不相等。这些对象中的每一个都在堆内存上并具有唯一的标识符(您可以在IDE的调试模式下检查该ID(Eclipse,Intellij等))。

1.为什么'=='在您的情况下为假

在所有使用'=='运算符的if语句中,将检查引用,并且在每种情况下,引用都是针对不同的对象的(如上所述),因此您的条件为false。

2.为什么equals()在您的情况下也返回false

在剩下的if语句中,您基本上使用的是equals()的默认实现,其中编译器对照此关键字(您在其上调用equals方法的引用)检查对象。因此,它的行为就像'==',并且出于相同的原因返回false。

有什么可以克服的呢?

我假设您的用例要求对象的实例变量值相同时,将它们视为相等,因此您必须通过覆盖equals方法来实现此逻辑。每当您想比较自定义对象时,强烈建议您重写equals()和hashCode()方法(因为相等的对象应生成相同的哈希码,因此您需要在代码中适当地加以注意)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么.NET中Hashtables和字典不使用Equals()方法而不是GetHashCode进行键比较?

为什么需要覆盖Java中的equals和hashCode方法?

equals和==之间的差异,以便与null进行比较?

使用std :: equal和equals运算符进行比较

为什么UserRole实现Serializable并覆盖equals()和hashcode()方法

为什么Entry接口定义了equals和hashCode之类的方法?

UnusedNullCheckInEquals :通过 equals 方法比较对象的正确方法是什么?

尽管实现了equals和hashcode方法,但是Hashmap的get和containskey方法无法检索对象

哪个内置的Java类不会覆盖equals和hashcode方法?为什么?

每次在对象的序列化之前和序列化之后都获得相同的哈希码,而不使用Java中的readResolve方法,为什么?

为什么我们在 HashMap 和 HashSet 中使用 equals() 方法而不实现比较器接口?

hashcode()和equals()方法

比较器和equals()

什么时候需要覆盖equals和hashcode方法?

在Java和equals(通用类)方法:类型安全

Java-基类和子类中的equals方法

Java中的hashCode和equals方法之间的关系

Java中的哪些类正在重写equals()和hashCode()方法?

为什么在对象中定义equals和hashCode?

为什么Android和IOS11无法通过NFC进行通信

Java中的==和.equals()

为什么要重写equals()和使用设置了许多价值关联hashCode()方法?

即使变量是引用类型,为什么Equals和ReferenceEquals方法的结果也不同?

为什么要在Java中同时覆盖equals()和hashCode()?

什么是HashCodeBuilder和EqualsBuilder,它们用于重写hashcode()和equals()方法?

hashCode和equals方法中的异常在Java中是否被允许和接受?

Java ArrayList不使用重写equals(Object o)方法进行比较

通过Equals或HashCode进行比较。哪个更快?

为什么要指定BigDecimal.equals来分别比较值和小数位数?