2015-12-05 42 views
4

我是測試字串,和我想出了下面的代碼:不同的輸出在同一個StringBuilder實例調用toString時

public static void main(String[] args){ 
    StringBuilder sb1 = new StringBuilder("Cuba"); 
    String str1 = sb1.toString(); 
    // n1 
    System.out.println(str1 == str2); 
} 

n1如果我把:

String str2 = sb1.toString(); 

我得到false 。但是,如果我的地方:

String str2 = str1; 

我得到true

我不知道爲什麼發生這種情況:兩個代碼指的是同一個實例,因此,這兩個輸出必須true

任何想法,爲什麼兩個輸出有什麼不同?我知道如何比較字符串,我只是好奇結果不同的原因。

+0

我知道如何比較字符串。只是好奇他們之所以有所不同。 –

+0

對此深感抱歉,我不是故意冒犯你。 –

+0

我不覺得那樣:) –

回答

6

這是StringBuilder.toString()在OpenJDK的8u40代碼:

@Override 
public String toString() { 
    // Create a copy, don't share the array 
    return new String(value, 0, count); 
} 

所以它返回一個新字符串,每次你調用它。

當您設置str2 = str1時,它們是相同的實例,因此==返回true。但是,當你設置str2 = sb1.toString(),它被設置爲一個新的String(具有相同的內容),所以==回報false

這在toString()的Javadoc(重點煤礦)實際規定:

返回表示此序列中數據的字符串。 一個新的字符串對象被分配並初始化,以包含當前該對象表示的字符序列。這個字符串然後返回。對此序列的後續更改不會影響字符串的內容。

注意,你不應該使用==比較String s到開始(參見this question)。

相關問題