前言:以前在培训班时听老师说 == 比较的是地址,equals比较的是内容,一直深信不疑,在日常工作使用中也没有出现问题,但现在翻看源码,发现在不重写equals方法时,比较的不是内容。
//如以下代码
//构造方法
public TestInterface3(String name,Integer agx){
this.name = name;
this.agx =agx;
}
/*
* 姓名
*/
private String name;
/*
* 年龄
*/
private Integer agx;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAgx() {
return agx;
}
public void setAgx(Integer agx) {
this.agx = agx;
}
public static void main(String [] args ){
TestInterface3 test = new TestInterface3("test",1);
TestInterface3 test1 = new TestInterface3("test",1);
System.out.println(test1.equals(test));
System.out.println(test1==test);
}
//结果
equals方法---false
==方法---false
以上代码我没有重写equals方法,用的是Object中的equlas方法,==结果是对的,因为它们两个的地址不相同,故返回false
如果equals比较的是内容的话,那么为什么我两个对象中的内容相同,结果却返回的是false,翻看Object源码中的equals发现,equals其实是比较的是地址,源码如下:
//Object源码中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
故不重写equlas比较的是地址,那么我们重写一下equals方法看结果是什么,代码如下
public TestInterface3(String name,Integer agx){
this.name = name;
this.agx =agx;
}
/*
* 姓名
*/
private String name;
/*
* 年龄
*/
private Integer agx;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAgx() {
return agx;
}
public void setAgx(Integer agx) {
this.agx = agx;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((agx == null) ? 0 : agx.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//重写的equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TestInterface3 other = (TestInterface3) obj;
if (agx == null) {
if (other.agx != null)
return false;
} else if (!agx.equals(other.agx))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public static void main(String [] args ){
TestInterface3 test = new TestInterface3("test",1);
TestInterface3 test1 = new TestInterface3("test",1);
System.out.println(test1.equals(test));
System.out.println(test1==test);
}
//结果
equals方法---true
==方法---false
这就能证明其实在不重写equals方法的情况下,比较的是地址,默认重写情况下比较的是内容
这时候有朋友说了为什么String类型在用equals时不用重写呢?那是因为String类已经帮咱们重写了equals与hashCode方法了
以上如有错误欢迎指正