为什么如果我在两个包装器对象上运行.equals方法,它将按照下面的WrapperEqualsEquals类返回true,但是(我强调但是)为什么我们需要覆盖下面Blob类中的equals方法,以使其返回true。基本上为什么包装器对象不得不重写.equals方法?
class WrapperEqualsEquals
{
public static void main(String []args)
{
Integer one=new Integer(1);
Integer oneB=new Integer(1);
System.out.println(one == oneB);
System.out.println(one.equals(oneB));
}
class OverrideEquals
{
public static void main (String [] args)
{
Blob a= new Blob(1,"a");
Blob b= new Blob(1,"a");
System.out.println(a==b);
System.out.println(a.equals(b));
}
class Blob
{
int blobNumber;
String blobText;
Blob(int blobNumber,String blobText)
{
this.blobNumber=blobNumber;
this.blobText=blobText;
}
//"overriding" the 'equals' method
public boolean equals (Object o)
{
if (o instanceof Blob)
{
Blob o2=(Blob)o;
return ((o2.blobNumber==this.blobNumber) &&(o2.blobText==this.blobText))?
true:false;
}
else
{
return false;
}
}
}
答案 0 :(得分:0)
默认情况下,仅当implicit和explicit参数的哈希码相等时,Object#equals(Object)才返回true。因为您创建了两个单独的Blob对象,所以它们不会指向相同的引用(根据hashCode()),因此使它们不等于,除非重写.equals方法。但是,根据Java约定,如果两个对象的哈希码相等,则.equals应该只返回true,因此您可能也希望覆盖hashCode。这也将保留内存使用。