一、区别
- "==":比较基本数据类型的时候是比较值是否相等,比较引用数据类型的时候是比较引用地址是否相等。
- "equals":默认情况下是比较引用地址是否相等,只不过是很多类重写了"equals"方法导致进行值比较。
二、详细比较
代码展示
String A = "zhansan";
String B = "zhansan";
String C = new String("zhansan");
System.out.println(A == B);//true
System.out.println(A == C);//false
System.out.println(A.equals(C));//true
此时A==B 为true是因为AB两个都是在常量池创建的对象使用,地址值时相等的,A == C为false是因为C是new出来的重新开辟了内存空间,与常量池内存地址不相等。但是为什么A.equals(C)是true呢?我们来查看equals内部到底是什么
public boolean equals(Object obj) {
return (this == obj);
}
此时我们是否很奇怪,equals的底层依然是使用"=="比较引用地址是否相等,此时你应该有疑问,为什么AC比较地址值的时候不是不相等吗?这是怎么回事?我们继续去看String这个类
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
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;
}
原来String类重写了equals方法,把比较两者的地址值变成了比较两者的内容值,此时你应该会明白为什么A.equals(C)相等的原因了。我们自己来写一个对象用equals比较是否相等。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Test
public void test() {
Person p1 = new Person("zhansan");
Person p2 = new Person("zhansan");
System.out.println(p1.equals(p2));//false
}
所以equals去做比较一定得看是否重写了equals方法。