"=="比較的是兩個字符串的內存地址。 "equals"比較的是兩個字符串的實際值。
例子1.
String s1="abc"; String s2="abc"; if(s1.equals(s2)){ System.out.println("兩個字符串值相等") } if(s1==s2){ System.out.println("兩個字符串指向同一個內存地址"); }
此時輸出:兩個字符串值相等
兩個字符串指向同一個內存地址
why:當給s2賦值abc時,s2會自動去尋找有沒有abc這個值得字符串。如果有,會copy s1(包含內存地址)。如果沒有,再創建一個新內存地址。
例子2.
String s1="abc"; String s2=new String("abc") if(s1.equals(s2)){ System.out.println("兩個字符串值相等") } if(s1==s2){ System.out.println("兩個字符串指向同一個內存地址"); }
此時輸出:兩個字符串值相等
why:s2創建了一個新對象,值為abc,與s1不再是同一個內存地址,所以只輸出:兩個字符串相等
例子3.
String s1="abc"; String s2=new String() s2="abc"; if(s1.equals(s2)){ System.out.println("兩個字符串值相等") } if(s1==s2){ System.out.println("兩個字符串指向同一個內存地址"); }
此時輸出:兩個字符串值相等
兩個字符串指向同一個內存地址
why: 雖然new了一個新對象,但沒有在此時給值,后來賦值的時候,仍是copy 了s1的內存地址。
例子4.
String s1="abc"; String s2=new String("abc"); s2=s2.intern(); if(s1.equals(s2)){ System.out.println("兩個字符串值相等") } if(s1==s2){ System.out.println("兩個字符串指向同一個內存地址"); }
此時輸出:兩個字符串值相等
兩個字符串指向同一個內存地址
why: 調用了intern()方法,此時s2先去找有沒有abc,如果有,copy 內存地址,如果沒有,創建新的。