对象怎样才算相等

关键议题

1、堆上同一对象的两个引用(引用相等性)

引用到堆上同一个对象的两个引用是相等的。如果对这两个引用调用hashcode()方法,会得到一样的值。如果没有覆盖的话,hashcode()默认行为是返回一个对象特有的序号(大部分JAVA是依据存储位置计算此值),所以不会有相同的hashcode()值。

想要知道两个引用是否相等,也可以通过==来比较变量的字节组合,如果引用同一个对象,那么它们的字节组合也是相等的。

Animals a=new Animals ();

Animals b=new Animals ();


2、堆上两个对象在意义上是相等的(对象相等性)

如果要将堆上两个不同的对象视为相等的,则必须要覆盖过从Object继承下的hashcode()方法和equals()方法。

必须覆盖过hashcode()方法才能保证它们有相同的hashcode()值,同样也要确保另一个以对象为参数的equals()调用返回true。

foo()为对象A上的方法,bar()为对象B上的方法

扫描二维码关注公众号,回复: 3215246 查看本文章

if(foo().hashcode()==bar().hashcode()&&foo().equals(bar())){ }


规则:

1、如果两个对象相等,则hashcode也是相等的,其中一个对象调用equals()必须返回true,即a.equals(b)则b.equals(a)

2、如果两个对象的hashcode相等,它们不一定是相等,如果两个对象相等,则hashcode()一定相等

3、若equals()被覆盖过,则hashcode()也必须被覆盖

4、hashcode()默认行为是对在heap上的对象产生独特的值,如果没有继承过hashcode(),则该类两个对象怎么都不会被认为是相同的。

5、equals()默认是执行==比较。就是去测试两个引用是否是heap上同一个对象,若equals()未被覆盖,则两个对象永远也不可能被视为相同。因为不同的对象有不同的字节组合。

a.equals(b)必须与a.hashcode()==b.hashcode()等值

但后者不一定要与前者等值。 

猜你喜欢

转载自blog.csdn.net/m0_37471638/article/details/77883264