对象的等于方法

时间:2013-07-29 09:52:33

标签: java equals

我创建了课程A。然后我创建了两个类A的对象。

A a1=new A(5);
A a2=new A(5);

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

if (a1.equals(a2)) // ->false

在同样的情况下,如果我使用像

这样的包装类
Integer i1=new Integer(5);
Integer i2=new Interger(5);

if (i1.equals(i2)) // ->returns true

为什么呢?谁能解释一下?

5 个答案:

答案 0 :(得分:6)

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

注意:在覆盖equals()时覆盖hashCode()通常是一种很好的做法。

我提供了一个示例实现:

equals()

Integer类已经覆盖了此方法Integer#equals()

  

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

建议阅读:

  1. Overriding equals and hashCode in Java
  2. Joshua Bloch - always override hashCode when you override equals

答案 1 :(得分:2)

为此,您需要覆盖类equals()的{​​{1}}方法 如果不覆盖该方法,它将使用A类equals方法,该方法检查引用变量是否引用相同的对象。

使用Object类,Integer方法已被覆盖,并检查该值。

此外,无论何时覆盖equals(),还要覆盖equals()

hashcode()

打印出public class A { private int number; A(int number){ this.number = number; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + number; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; A other = (A) obj; if (number != other.number) return false; return true; } public static void main(String[] args) { A a1 = new A(5); A a2 = new A(5); System.out.println(a1.equals(a2)); } }

  

为什么呢?谁能解释一下?

使用true类,Integer方法已被覆盖,并检查该值。

Integer#equals()

theJavaGeek

提供了一个帮助理解equals方法重要性的好教程

答案 2 :(得分:2)

如果你有这个,

 Integer i1=new Integer(5);
 Integer i2=new Interger(5);
 if(i1.equals(i2))

它将返回true

因为Integer类会覆盖equals方法来比较vales而不是比较引用。

对于包装类Integer,从-128到127的文字来自同一个池。

你会发现这个有趣的来自HERE, see this for answer

    Integer i1 = 127;
    Integer i2 = 127;

    if(i1==i2){
        System.out.println("true"); //prints true
    }else{
        System.out.println("false");
    }

    Integer i3 = 128;
    Integer i4 = 128;

    if(i3==i4){
        System.out.println("true");
    }else{
        System.out.println("false"); //prints false
    }

答案 3 :(得分:0)

您应该为A类重写equals()方法

例如

class A{
   int b;
   A(int b){
      this.b = b;
   }
   @Override
   public boolean equals(A a){
      return this.b ===a.b;      
   }

}

答案 4 :(得分:0)

这是因为当您在equals()个实例上致电A时,它会调用Object类的等号,比较参考

所以,如果你愿意的话:

instance1.equals(instance1); //will return true

要提供自定义等于实现,您必须在类中覆盖等于方法

class A{


   @Override
   public boolean equals(Object obj){
      return equality;
   }

}