下列情况是不需要改写equals方法的:
-
同一个类的不同实例本质上是唯一的,就是个实例都有自己的本体(Identify)。
- 不关心该类是否提供了逻辑相等的功能。
- 父类已经改写过equals方法,对于子类来说,继承过来的equals方法已经是最合适的了。
- 一个类是私有的或者是包可见的,且确定它的equals方法不会被调用。
对于需要改写equals方法的时候,应该遵守如下约定:
-
自反性,即x.equals(x)为true.
- 对称性,即当且仅当x.equals(y)为true时y.equals(x)也一定为true。
- 传递性,即对任意的x,y,z,如果x.equals(y)为true,并且y.equals(z)也为true,那么x.equals(z)也必须为true。
- 一致性,即对于任意的x,y,如果x,y都没有被修改的话,那么多次调用x.equals(y)要么一致地返回ture,要么一致地返回false.
- 对于非空的引用x,x.equals(null)一定要返回false.
改写equals方法时的建议:
-
用==操作符检查实参是否为指向对象的同一个引用。
- 使用instanceOf检查实参是否是正确的类型。
- 在2的基础上,把实参转换成正确的类型。
- 检查实参的域与当前对象的域值是否相等。
- 编写完equals方法后,检查是否满足等价关系。
例如:
public boolean equals(Object o)
{
if(o== this) return true;
if(!(o instanceof xxxx) return false;
xxx in = (xxx)o;
return ……..
}
改写equals方法的告诫:
-
不要企图让equals方法做太多事。
- 不要使equals依赖不可靠的资源,否则会违背一致性。
- 不要将equals中的对象装换为其他的类型。
- 要注意的时候不要提供这样的方法public boolean equals(MyClass o)这样是重载并不是覆盖Object的equals方法。
总结:不用重写equals方法就尽量不要去找麻烦,确实需要改写equals方法时,遵守通用约定,因为对象会在程序中不停的传递,所以可能会导致程序运行不正常,甚至崩溃而很难找到程序崩溃的原因。总之,还是遵守约定吧!
分享到:
相关推荐
在java语言当中,equals和==之间究竟有什么区别? 而这道题的答案也是千篇一律: equals是用来比较对象的内容,而==是用来比较java对象的地址。 貌似这个问题大家都已经十分的了解了?为什么我还要单独拿出来说呢?...
重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例
2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....
Java中的==与equals()实例方法Java中测试两个变量是否相等的方法有两个,一个是用==运算符,另一个就是object类提供的equals()方法。2
Java中equals方法隐藏的陷阱
java_equals用法,用来熟悉重写equals方法的
本文讲述了什么时候重写equals方法和如何重写equals方法。
java代码-使用java解决实现Student类的equals重载函数的源代码 ——学习参考资料:仅用于个人学习使用!
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
C#程序设计-3期(KC008) KC008110100003-错误的认为==和Equals作用相同.docx 学习资料 复习资料 教学资源
equals方法重写作业,Students类,有三个属性id ,name ,grade。还有一个测试类用于测试创建了三个对象前两各对象的数据完全一样,第三个对象的数据不同。使用equals方法比较。并输出结果。
能够加强对java中equals与==区别的理解。
{1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {...
Java语言深入_equals
Java equals 方法与hashcode 方法的深入解析.rar
Node.js 0.12 buffer.equals() ponyfill
计算机后端-Java-Java核心基础-第14章 面向对象06 14. 重写equals().avi
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
计算机后端-Java-Java核心基础-第14章 面向对象06 13. equals()的使用.avi