equals与==的区别:
equals用于检测两个对象的内容是否相等(即对中的内容是否相同)
==在用于比较基本数据类型时,两者值相同,比较结果为true
在用于比较引用时,若引用指向内存中的同一对象,比较结果为true(==比较的是栈中的内容是否相同)
为了更清楚的了解它们的工作过程,先来看看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;
}
可以看到,equals默认调用了“==”比较方法,在传入参数为String类时,重写了这个方法,进行字符的逐个比较。所以,equals可以用来比较字符串是否相同。
所以,equals具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么它和==号等价。
下面测试两者的作用:
package test;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
String str1 = "world";// 直接赋值,该字符串放在常量池(在堆中)中
String str2 = new String("world") ; // 通过new赋值,新建了一个对象
String str3 = str2 ; // 传递引用,str放在栈内存中
System.out.println("str1 == str2 : " + (str1==str2)) ;
System.out.println("str1 == str3 : " + (str1==str3)) ;
System.out.println("str2 == str3 : " + (str2==str3)) ;
System.out.println("======================================================");
System.out.println("str1 equals str2 : " + (str1.equals(str2))) ;
System.out.println("str1 equals str3 : " + (str1.equals(str3))) ;
System.out.println("str2 equals str3 : " + (str2.equals(str3))) ;
}
}
输出结果如下:
str1 == str2 : false 不是同一个对象,地址不同 str1 == str3 : false 不是同一个对象,地址不同 str2 == str3 : true 同一对象 ====================================================== str1 equals str2 : true str1 equals str3 : true str2 equals str3 : true
由于equals重写了比较方法,只比较两个字符串的值是否相同。
String str = "World";中,str放在栈内存中,“World”放在堆内存中,str是一个指向“World”首地址的引用。