对象的等于方法

Ros*_*ose -2 java equals

我创造了课程A.然后我创建了两个类对象A.

A a1=new A(5);
A a2=new A(5);
Run Code Online (Sandbox Code Playgroud)

然后,如果我尝试使用equals方法比较对象,它返回false.

if (a1.equals(a2)) // ->false
Run Code Online (Sandbox Code Playgroud)

在同样的情况下,如果我使用包装类

Integer i1=new Integer(5);
Integer i2=new Interger(5);

if (i1.equals(i2)) // ->returns true
Run Code Online (Sandbox Code Playgroud)

为什么?谁能解释一下?

NIN*_*OOP 6

您必须覆盖equals()类中的方法A.默认情况下,它使用从Object类继承的实现,即Object#equals()来比较引用,即如果两个对象都是驻留在堆中的同一对象,则返回true或者否则false.如果需要检查对象内容是否相等,请覆盖equals()类中的方法.

注:这通常是一个很好的做法,以覆盖hashCode()方法,而overidding equals().

我提供了一个示例实现:

class A {
 private int value ;
 A(int value) {
     this.value = value;
 }
 @Override
 public boolean equals(Object obj) {
    if(obj==null || !(obj instanceof A)){
        return false;
    }
    return this.value==((A)obj).value; 
 }
 @Override
 public int hashCode() {
     return this.value;
 }
}
Run Code Online (Sandbox Code Playgroud)

Integer类已经覆盖了这个方法,Integer#equals().

将此对象与指定的对象进行比较.当且仅当参数不为null并且是包含与此对象相同的int值的Integer对象时,结果才为真.

推荐阅读:

  1. 覆盖Java中的equals和hashCode.
  2. Joshua Bloch - 当你重写equals时总是覆盖hashCode

  • 我建议还注意到,当覆盖equals时,重要的是还要覆盖hashCode以确保两个相等的对象具有相同的哈希码. (2认同)