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)化。