Android:Java語言字符串比較“==”形式和“equals()”形式的不同

a.equals(b);    //表示相同
!a.equals(b);   //取非表示不相同

一、熟悉C++的人對于兩個字符串比較的代碼一定很了解,可以用==直接比較字符串,例如(string1==string2) ,但在java中,如果用==比較,即使在兩個字符串的內(nèi)容完全相同的情況下也會返回false ,Java中必須使用string1.equals(string2)來進行判斷。如果使用“==”比較兩個對象時,比較的是兩個對象的內(nèi)存地址,所以不相等。即使它們內(nèi)容相等,但是不同對象的內(nèi)存地址也是不相同的。

二、字符串是一個比較特殊的對象。字符串之所以特殊,是因為java會在內(nèi)容中為String類型的對像開辟一個空間,我們叫他串池!
字符串對象的創(chuàng)建之后會被放入到串池中。串池有一個特點,就是對于相同對象,池中只存儲一份。那么串池把什么樣的String看做是相同的String呢。請看:String a="abc";和String b="abc" 對于這樣的類型的聲明方式(不是new出來的)串池把他們看做一個對象,所以池中只存儲一分,只是有a 和b 兩個引用罷了! 對于String只要用new關(guān)鍵字new出來的string,都是單獨的一個對象。而“==”號,他是用來比較對象的內(nèi)存地址,所以只要用==號來比較string,只要不是自己比自己,那肯定是false。 而String中的equls方法已經(jīng)做了處理,他是比較內(nèi)容,所以要比較string的內(nèi)容的時候而不是地址的時候,那就用它吧

三、看這個例子

 1、java代碼
public class final_keyword {
    public static void main(String[] args)  {
    String s1=new String("Hello"); 
    String s2=new String("Hello");  
 
    String s3="Hello"; 
    String s4="Hello"; 
    
    if(s1==s2)
         System.out.println("s1 of the string is equal to s2 of the string!");
    else
         System.out.println("s1 of the string is not equal to s2 of the string!");
    if(s3==s4)
         System.out.println("s3 of the string is equal to s4 of the string!");
    else
         System.out.println("s3 of the string is not equal to s4 of the string!");
     
    }
}
2、編譯執(zhí)行
a1.png
 3,結(jié)果是s1和s2不相等,s3和s4相等,為什么這樣呢?因為他們s3和s4指向的同一個對象。 雖然s1和s2使內(nèi)容相同,由于不是指向同一個對象,也會返回false。所以建議使用equals(),因為equals比較的才是真正的內(nèi)容 。

四、再看一下下面的例子

 1、java代碼
public class final_keyword {
    public static void main(String[] args)  {
        String a = "hello2"; 
        final String b = "hello";
        String d = "hello";
        String c = b + "2"; 
        String e = d + "2";
        System.out.println("compare a with c"); 
        System.out.println((a == c));
        System.out.println("compare a with e"); 
        System.out.println((a == e));   
    }
}
 2、編譯&執(zhí)行
a2.png
 3、結(jié)果分析:大家可以先想一下這道題的輸出結(jié)果。為什么第一個比較結(jié)果為true,而第二個比較結(jié)果為fasle。這里面就是final變量和普通變量的區(qū)別了,當final變量是基本數(shù)據(jù)類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當于直接訪問的這個常量,不需要在運行時確定。這種和C語言中的宏替換有點像。因此在上面的一段代碼中,由于變量b被final修飾,因此會被當做編譯器常量,所以在使用到b的地方會直接將變量b 替換為它的值。而對于變量d的訪問卻需要在運行時通過鏈接來進行。想必其中的區(qū)別大家應(yīng)該明白了,不過要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器才會進行這樣的優(yōu)化。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容