一、问题
在我们新建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()方法重写规定:
【自反性、对称性、传递性、一致性】
相关文章
- Object类中equals,hashCode和toString方法的学习
- Java中Object类的equals()和hashCode()方法深入解析
- 重写Object类中的Equals方法(Java)
- 类Object中的equals()方法
- 关于重写equals()和hashCode()的思考
- Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
- HashCode和equals方法重写
- Object的equals和hashCode方法
- 为什么覆写equals()方法的时候总是要覆写hashcode()?