字符串的判斷有2種:
1、判斷地址是否相等 用:==
2、判斷值是否相等 用:equals方法
Object類作為所有類的超類,而Object類的equals方法是直接比較地址的,源碼如下:
public boolean equals(Object obj) { return this == obj; }
所以,在String類中的equals方法,是重寫了Object類的equals方法的,String類的equals方法源碼如下:
public boolean equals(Object anObject){ if(this==anObject){ //比較地址,如果地址相等,直接返回true return true; } if(anObject instanceof String){ //如果地址不相等,那就比較類型,如果類型不相等,直接返回false String anotherString =(String)anObject; //由於是String類的比較,所以要把對象強轉為String類 int n=value.length; //記錄當前對象的字符長度 if(n==anotherString.value.length){ //判斷當前對象的字符串長度和傳入的字符串長度是否一樣,不一樣,直接返回false,如果一樣,接着往下比較 char v1[]=value; char v2[]=anotherString .value; int i=0; while(n-- !=0){ //將2個字符數組的循環對比 if(v1[i] !=v2[i]) //將字符數組的字符進行對比 return false; //如果出現一個字符不同,馬上返回false i++ } return true; } } return false; }
String類的equals比較內容相同思路如下:
1、先判斷地址是否相等,相等返回true
2、比較類型是否一樣,不一樣,返回false
3、將傳入的對象強轉為String,比較長度,長度不相等,返回false
4、長度相等,循環比較字符數組的元素,當有一元素比較內容不相同,馬上返回false
5、2個字符數組循環比較所有元素,沒有內容不相同的元素,返回true
測試代碼如下:
public class TestString { public static void main(String[] args) { String str="abc"; String str2=new String("abc"); System.out.println("兩個對象的內存地址是否相等:"+(str==str2));//false /**比較對應位置上的字符是否相等,如果所有的對象位置上的字符均相等,true,否則返回false*/ System.out.println("兩個對象的內容是否相等:"+(str.equals(str2))); //以下結果為 false /**因為Person對象 instanceof String 的結果為false ,直接返回false*/ System.out.println("String對象與Person對象的內容是否相等:"+(str.equals(new Person()))); } } class Person{ }
水平有限,還請多多指教!