一句废话,eqauls方法是用来判断对象是否相等的。
怎么判断的呢?可以重写类的equals方法,在equals方法中实现判等逻辑。
但是没有重写equals方法,怎么判断两个对象是否相等呢?根据java的继承机制,咱们去找它爸爸,去看看父类是怎么实现的equals方法。类的老祖宗Ojbect中,equals方法实现十分简单,如下:
通俗易懂,就是判断两个对象地址是否相等。
看下面一例:
定义student类
执行测试类:
结果输出:
是否equal:true
set大小:2
为啥set里放进了两个equal的对象;答:因为hashCode不同;
对呀,还有hashCode这回事;
先来说明为什么set中放入了两个equal的对象;因为在向set中添加数据的时候先检查两个对象的hashCode是否相等,如果不等的话,会直接将对i想放入到集合中。如果两个对象的hashCode相等时,才会去调用equals方法判断是否相等;
那为什么没有重写hashCode方法,他们的hashCode值就不同能。再到父类中去寻找hashCode的实现。
可以看到这是调用一个本地方法;在注释中发现Object的hashCode会对每个对象返回唯一的hash值。
so,在没有重写hashCode方法的时候两个Student的hash值肯定是不同的。所以两个对象都可以放到set中。
那么什么情况下要重写equals方法和hashCode方法呢?