一般編程語言中喜歡用==符號來判斷java中兩個字符串是否相等,例如c++。c++提供了操作符的重載,所以可以重載==運算符來判斷。
但是由於java中,沒有提供運算符重載,而且java中沒有提供基本的string類型、也沒有把string看成char數組,所以比較的時候不能用==。java中,比較兩個字符串是否相等用equals()和equalsIgnoreCase()方法。
java中==比較的是兩個變量是否存放在同一個內存地址中,如果兩個對象存放在同一個地址,用==判斷來比較返回true,否則返回false。
在java中字符串常量存放在數據段中,是共享的,也就是如果你寫String a="ab";String b="ab";那么內存中只有一個ab,變量a、b指向同一個內存塊。此時a和b是相等的,用a==b來判斷返回true。
但是如果對字符串進行了某些操作,比如+或者substring(),產生的字符串不是共享的,而是存放在另外一個內存塊中。
比如:
String a = "hello";
String b= a.substring(0,2);
則b=="hel"可能是false。
示例:
/** *This program is to test how java saves String valuable. *@author hewenwu */ public class StringTest { /** * @param args */ public static void main(String[] args) { String a="abcd"; String b="ab"; String d="cd"; String c=a.substring(0,1); String e=b+d; String f="abcd"; //test1 if(c=="ab") {System.out.println("c==ab");} else System.out.println("c!=ab"); //test2 if(c==b){System.out.println("c==b");} else System.out.println("c!=b"); //test3 if(a==e){System.out.println("a==e");} else System.out.println("a!=e"); //test4 if(a==f){System.out.println("a==f");} else System.out.println("a!=f"); } }
輸出結果:
c!=ab
c!=b
a!=e
a==f
從test1、test2、test3可以看出,操作+和substring()產生的字符串是不共享的
從test4可以看出,java中字符串常量是共享的。