转载: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