Java String + 拼接字符串原理


Java String + 拼接字符串原理

首先來一道思考題:

String str1 = "111111";

String str2 = "222222";

String str = str1 + str2;

System.out.println(str);

很明確,上述代碼輸出的結果是:"111111222222",但是它工作原理是怎樣的呢?

 

由於字符串拼接太常用了,java支持可以直接用+號對兩個字符串進行拼接。其真正實現的原理是中間通過建立臨時的StringBuilder對象,然后調用append方法實現。如何驗證呢?

上述代碼文件寫在Test.java main方法中,使用 javac Test.java 編譯,在執行 javap -verbose Test ,可以看到如下信息:

0: ldc           #2                  // String 111111

2: astore_1

3: ldc           #3                  // String 222222

5: astore_2

6: new           #4                  // class java/lang/StringBuilder

9: dup

10: invokespecial #5                  // Method java/lang/StringBuilder."":()V

13: aload_1

14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

17: aload_2

18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

21: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

24: astore_3

25: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;

28: aload_3

29: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V

32: return

對於java來說,這段代碼原理上應該是:

String str1 = "111111";

String str2 = "222222";

StringBuilder sb = new StringBuilder();

sb.append(str1);

sb.append(str2);

String str = sb.toString();

System.out.println(str);

再來看一下 StringBuilder 的 toString 方法

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

由此也可以得到 常見的面試題中為什么字符串對象相加后與直接組合(equal為true)使用 == 比較時為 false

 

再來一道思考題,如下代碼的執行結果是什么?是報錯,還是"null222222"

String str1 = null;

String str2 = "222222";

String str = str1 + str2;

System.out.println(str);

正確答案是:"null222222"

原理:

String str1 = null;

StringBuilder sb = new StringBuilder();

sb.append(str1 );

這段代碼,StringBuilder對象append一個null字符串會怎么處理呢,這就要去查看源碼了。

源碼中我們可以看到以下這段代碼:

public StringBuilder append(StringBuffer sb) {

    super.append(sb);

    return this;

}

該方法繼承了父類的方法,父類為AbstractStringBuilder,再去父類中查看:

private StringBuilder append(StringBuilder sb) {

    if (sb == null)

        return append("null");

    int len = sb.length();

    int newcount = count + len;

    if (newcount > value.length)

        expandCapacity(newcount);

    sb.getChars(0, len, value, count);

    count = newcount;

    return this;

}

真相大白了,這里null會變成"null"。因此答案就是"null222222"了。

 

總結:

String字符串拼接通過StringBuilder走中間過程,通過append方法實現

null拼接會變成字符串"null"

程序有大量字符串拼接時,建議考慮直接寫StringBuilder實現,就不需要底層new很多臨時sb對象了。

 

原文鏈接:https://blog.csdn.net/u012337114/article/details/81317992


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM