本节论述了通用对象-java类默认的继承对象(Object)的方法和注意事项,同时也对具有类似特性的Comparable.compareTo()也进行了讲解。
一.覆盖equals时要遵守通用约定
1.Object的equals如下:
public boolean equals(Object obj) {
return (this == obj);
}
每个类只与自身相等,这个相等是指同一个对象。如果你的equals定义就是这样的,那是不需要覆盖的。
如下几种情况是不需要覆盖的(1)代表活动实体的类(thread等);(2)设计者认为不关心逻辑相等,例如java.util.Random类就没有实现equals (3)超类继承过来的行为,对于子类同样适用的情况,如AbstractSet等
(4)只有一个对象的值类,如Enum
2.要覆盖equals的情况
(1). 类是私有的或包级私有的,防止被意外调用,需要做异常处理
@override
public boolean equals(Object o){
throw new AssertionError();
}
(2).普通的值类,如Integer等
3.覆盖equals需要遵守的约定
自反性,x.equals(x)
对称性
传递性
一致性 多次调用x.equals(y)必须一致的返回true或false
我们看违反了其中一条-对称性时会出现什么情况
一个实现了区分大小写的String类如下:
public final class CaseInsensitiveString{
private final String s;
@override
public boolean equals(Object o){
if(o instanceof CaseInsensitiveString){
return s.equalsIgnoreCase((CaseInsensitiveString)o);
}
if(o instanceof String){
return s.equalsIgnoreCase((String)o);
}
}
}
乍一看,没有什么问题,
CaseInsensitiveString cis = new CaseInsensitiveString("Job");
Stringg s = "job";
cis .equals(s)返回的是true;而对于String类的方法是不区分大小写的,s .equals(cis)必然返回false,显然不满足自反性,假如你把cis放入ArrayList,由于ArrayList调用了如下方法,判断是否相等
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
也就是直接调用了Object的equals,这时候你调用list.contains(s);返回的是false,这个是个巧合,很有可能返回了true;
结论:当你违反了equals约定,当其它类(包含equals函数调用)操作你的这个对象时,鬼知道结果是什么。原因很简单,你们都各自定义了equals,又没有统一规范,就好比两个瞎子画像,永远不可能一样。
修改如上错误,只要去掉第二个case就可以了
if(o instanceof CaseInsensitiveString){
return s.equalsIgnoreCase((CaseInsensitiveString)o);
}
4.如何在使用继承关系增加新的属性时,依然保留equals约定:
@override
public boolean equals(){
if(0==null||o.getClass()!=getClass()){
return false;
}
Point p = Point(o);// 强制转化为付费
return p.x=x&&p.y=y;
}
5.java 库中的equals有些也是不符合标准的,要慎用,比如原来java.sql.TimeStamp中如下定义了equals
public boolean equals(Timestamp ts) {
if (super.equals(ts)) {
if (nanos == ts.nanos) {
return true;
} else {
return false;
}
} else {
return false;
}
}
违反了对称性,不能和Date对象用于同一个集合。
目前1.6.10版本已经做了修正,增加了一个方法,如下:
public boolean equals(java.lang.Object ts) {
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);
} else {
return false;
}
}
这样简单清晰多了。
6. 如何高效的写equals函数
实例如下:
public boolean equals(java.lang.Object phoneNumber) {
if(this== phoneNumber){// 1.如equals比较耗费性能,先用==判断是
//否是对象的引用
return true;
}
if (ts instanceof phoneNumber) {// 2. instanceof 判断类型
PhoneNumber pn=(PhoneNumber)phoneNumber; // 3. 转
//换类型
return areaCode==null || (areaCode!=null&&areaCode.equals(pn.areaCode));
//4.关键域的比较,注意吧null情况,如果通常是相同对象引用,则这样快些
}
//5.编写完成,注意检查对称性,传递性和一致性。
//6.覆盖equls时总要覆盖hashCode
@override
public hashCode(){
}
分享到:
相关推荐
Java解惑系列之一--equals和==之间究竟有什么区别 稍微学过一些java的同学都可能在网络上看到这样的一道题: 在java语言当中,equals和==之间究竟有什么区别? 而这道题的答案也是千篇一律: equals是用来比较对象...
计算机后端-Java-Java核心基础-第14章 面向对象06 14. 重写equals().avi
计算机后端-Java-Java核心基础-第14章 面向对象06 13. equals()的使用.avi
计算机后端-Java-Java核心基础-第14章 面向对象06 17. equals()练习2:代码实现.avi
计算机后端-Java-Java核心基础-第14章 面向对象06 16. equals()练习1:代码实现.avi
java代码-使用java解决实现Student类的equals重载函数的源代码 ——学习参考资料:仅用于个人学习使用!
计算机后端-Java-Java核心基础-第14章 面向对象06 15. 总结==与equals().avi
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
Java中的==与equals()实例方法Java中测试两个变量是否相等的方法有两个,一个是用==运算符,另一个就是object类提供的equals()方法。2
equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。 hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的...
2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
计算机后端-Java-Java核心基础-第24章 集合01 23. 关于hashCode()和equals()的重写.avi
能够加强对java中equals与==区别的理解。
equals方法重写作业,Students类,有三个属性id ,name ,grade。还有一个测试类用于测试创建了三个对象前两各对象的数据完全一样,第三个对象的数据不同。使用equals方法比较。并输出结果。
java_equals用法,用来熟悉重写equals方法的
Java中equals方法隐藏的陷阱
重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例
java中equals和==的区别.doc java中equals和==的区别.doc
详细介绍和讲解Java中的==和equals区别