前言:
前两天项目经理给我推荐了本书《practical java》,让我每天看个几页有利于以后的开发,排错。我简单的看了几章,发现好多东西之前只是会用,原理理解的不透彻,今天整理下前天看的equals() 源码,做个笔记。
1.先上结论:
== 和 equals()的区别:
- == 对于基础类型 比较的是vlaue,而引用类型比较的是地址.
- equals 比较的是值, 如果 比较对象 需要重写equals,如果不重写可以加 注解(@Data)
- @Data包括这个注解@EqualsAndHashCode(callSuper=true)
对象默认执行的 java.lang.Object 的 equals()方法。
2.举例看源码
字符串类型比较:
代码:
String s = new String("aa");
String s1 = new String("aa");
System.out.println(s==s1);
System.out.println(s.equals(s1));
结果:
false
true
== 比较的是地址 equals比较的是 值
源码:
public boolean equals(Object anObject) {
if (this == anObject) {//使用==操作符检查“参数是否为这个对象的引用”(比较对象地址)
return true;
}
if (anObject instanceof String) { //判断是否是String类型的实例
String anotherString = (String)anObject;//强转为string类型
int n = value.length;
if (n == anotherString.value.length) {//判断两个字符串的长度是否相同
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//一个字符一个字符的进行比较
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
总结:
(1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。
(2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false
对象比较:
代码:
public static void main(String[] args) {
BasketBall b1=new BasketBall("brand",20.0);
BasketBall b2=new BasketBall("brand",20.0);
System.out.println(b1.equals(b2));//不重写 则调用Object equals的方法
}
}
class BasketBall {
private String brand;
private double price;
public BasketBall() {
}
public BasketBall(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
// @Override
// public boolean equals(Object obj) {
//
// if (null != obj && obj.getClass() == getClass()) {
//
// BasketBall ball = (BasketBall) obj;
// if (brand.equals(ball.brand) && price == ball.price) {
//
// return true;
// }
// }
// return false;
// }
}
结果:
false
重写equals代码:
@Override
public boolean equals(Object obj) {
if (null != obj && obj.getClass() == getClass()) {
BasketBall ball = (BasketBall) obj;
if (brand.equals(ball.brand) && price == ball.price) {
return true;
}
}
return false;
}
重写equals()后结果:
true
源码:
public boolean equals(Object obj) {
return (this == obj);
}
总结:
比较两个对象比的是地址没有意义,一般判断两个对象是否相等,比较的是对象的成员,所以我们一般自定义对象都需要重写equals方法
3.总结经验
- 若要比较对象是否相等,其class 有责任提供一个正确的equals()。
- 在[想当然的调用 equals()]之前,应先检查并确保你所使用的 class 的确 实现了 equals()。
- 如果你所使用的class 并未实现 equals(),请判断 java.lang.Object的缺省
函数是否可胜任。 - 如果无法胜任,就应该在某个外覆类(wrapperclass)或 subclass 中撰 写你自己的 equals()。
ps: 如果有发现问题的,请及时联系博主修改