equals与"=="的差异和理解
equals与"=="的区别和理解
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”首地址的引用。