一、需求
這段程序的結果是什麼?
public class Test01 {
public static void main(String[] args) {
String s1 = "ab" + "c";
String s2 = "abc";
System.out.println(s1 == s2 + " : " + s1.equals(s2));
}
}
二、輸出運行
結果是false,
三、分析
1.判斷s1==s2
String s1 = "abc";
String s2 = "ab" + "c";
System.out.println(s1 == s2); // true
// (1).首先判斷s1 = "abc",創建了一個對象, 當這段代碼被執行的時候,JVM會先到字符串池中查找,是否存在值爲"abc",如果存在,則不再創建新的對象,直接返回已經存在對象的引用;如果不存在,則先創建這個對象,然後把它加入到字符串池中,在將它的引用返回。
// (2).s2="ab"+"c",因爲"ab"和"c"都是常量,因此使用"+"連接兩個常量字符串的時候,如果存在連接之後的字符串,則不會重新創建新的對象,而是直接引用池中的字符串對象。
2.判斷s1.equals(s2)
System.out.println(s1.equals(s2)); // true
// 接着判斷s1.equals(s2),判斷前需要明白一點,String類型的equals方法是經過重寫的,其規則定義是:只要字符串內容相等,就返回爲true。
// 到這裏大家可能會說,兩個結果都是true啊!
//其實不是這樣,接着往下看。
3.運算符的優先級
// 由於運算符優先級的問題
System.out.println(s1 == s2 + " : " + s1.equals(s2)); // false
// 等價於
System.out.println(s1 == (s2 + " : " + s1.equals(s2)));
// 也就是說:"=="的優先級低於"+",所以輸出爲false。
// 到這裏有人就會說,既然"=="的優先級低於"+",那我這樣呢?那就是true和true了。
System.out.println((s1 == s2) + " : " + s1.equals(s2)); // true : true