一、问题
在我们新建java对象的时候,如果后期用到对象比较,就必须重写equals(0、hashcode()方法
为什么必须重写这两个方法?
只是比较相等的话,重写equals()方法不就可以吗?为什么还要重写hashcode()方法?
参考文章:【http://blog.csdn.net/zhangqindabendan/article/details/54800303】
二、分析
(1)必须重写【equals()】的原因:
Object类比较对象相等的原理是:
【比较相等的两方指向同一对象】
【对于任何非空引用值 x 和 y ,当且仅当 x 和 y 引用同一对象(同一块内存地址),此方法才返回 true】
实际比较相等时:
【我们认为保存数据相同的对象就相等,不关心是否同一内存地址】
【new出来的对象内存地址永远不相同】
(2)必须重写【hashcode()】的原因:
hashcode()方法的常规协定:该协定声明相等的对象必须具有相等的哈希码
【当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true】
【当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false】
没有重写该方法的后果:
【某些利用对象hashcode值做为索引的情况下,会造成混乱,相当于没有重写equals方法】
(3)equals()方法重写规定:
【自反性、对称性、传递性、一致性】