转载:https://www.cnblogs.com/xudong-bupt/p/3960177.html
在java编程或者面试中经常会遇到 == 、equals()的比较。
1. ==
java中的==是比较两个对象在JVM中的地址。比较好理解。看下面的代码:
public class TestDog {
public static void main(String[] args) {
String s1 = "Aa";
String s2 = "Aa";
String s3 = new String("Aa");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
}
}
上述代码中:
(1)s1 == s2为true,是因为s1和s2都是字符串字面值"Aa"的引用,指向同一块地址,所以相等。
(2)s1 == s3为false,是因为通过new产生的对象在堆中,s3是堆中变量的引用,而是s1是指向字符串字面值"Aa"的引用,地址不同所以不相等
2.equals()
equals是根类Obeject中的方法。源代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
可见默认的equals方法,直接调用==,比较对象地址。
不同的子类,可以重写此方法,进行两个对象的equals的判断。
String类源码中重写的equals方法如下,
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;
}
从上面的代码中可以看到,
(1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。
(2)若果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false。
总结:
(1)==默认比较对象在JVM中的地址。
(2)equal比较对象,默认也是比较对象在JVM中的地址,同==
原文:https://www.cnblogs.com/szk650/p/10283477.html