2019-12-27-最簡單的代碼看看你能答對嗎?

一、需求

這段程序的結果是什麼?

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章