java中字符串拼接方式

                                         java中字符串拼接方式

由於String對象時不可變對象,因此在需要對字符串進行修改操作時(如字符串連接和替換),String對象總是會生成新的對象,所以其性能相對較差。

  String常量的累加操作:對於靜態字符串的連接操作,Java在編譯時會進行徹底的優化,將多個連接操作的字符串在編譯時合成一個單獨的長字符串。

  String變量的累加操作:底層使用了StringBuilder的功能。

  StringBuffer和StringBuilder的擴容策略:當字符串緩衝區容量不足時,原有容量將會加倍,以新的容量來申請內存空間,建立新的char數組,然後將原數組中的內容複製到這個新的數組當中。因此,對於大對象的擴容會涉及大量的內存複製操作。所以,如果能夠預先評估StringBuilder或StringBuffer的大小,將能夠有效的節省這些操作,從而提高系統的性能。

JAVA的字符串拼接與性能

  在JAVA中拼接兩個字符串的最簡便的方式就是使用操作符”+”了。如果你用”+”來連接固定長度的字符串,可能性能上會稍受影響,但是如果你是在循環中來”+”多個串的話,性能將指數倍的下降。假設有一個字符串,我們將對這個字符串做大量循環拼接操作,使用”+”的話將得到最低的性能。但是究竟這個性能有多差?

  +, Join,StringBuffer,StringBuilder或String.concat()

  1.String 是final對象,不會被修改,每次使用 + 進行拼接都會創建新的對象,而不是改變原來的對象,也屬於線程安全的;

  2.StringBuffer可變字符串,主要用於字符串的拼接,屬於線程安全的;(StringBuffer的append操作用了synchronized)

  3.StringBuilder可變字符串,主要用於字符串的拼接,屬於線程不安全的;

Code:

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
public class TestString {
   public static void main(String[] args) {
       //plus拼接字符串方式
        String s = "";
        long ts = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s = s + String.valueOf(i);
        }
        long te = System.currentTimeMillis();
        System.out.println("Plus cost {"+( te - ts) +"} ms");
        //concat拼接字符串方式
        String s2 = "";
        long ts2 = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s2 = s2.concat(String.valueOf(i));
        }
        long te2 = System.currentTimeMillis();
        System.out.println("concat cost {"+(te2 - ts2)+"} ms");
        //StringUtils.join拼接字符串方式
        List<String> list = new ArrayList<String>();
        long ts3 = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            list.add(String.valueOf(i));
        }
        StringUtils.join(list, "");
        long te3 = System.currentTimeMillis();
        System.out.println("StringUtils.join cost {"+(te3 - ts3)+"} ms");
        //StringBuffer拼接字符串方式
        StringBuffer sb = new StringBuffer();
        long ts4 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            sb.append(String.valueOf(i));
        }
        sb.toString();
        long te4 = System.currentTimeMillis();
        System.out.println("StringBuffer cost {"+(te4 - ts4)+"} ms");
        //StringBuilder拼接字符串方式
        StringBuilder sb5 = new StringBuilder();
        long ts5 = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            sb5.append(String.valueOf(i));
        }
        sb5.toString();
        long te5 = System.currentTimeMillis();
        System.out.println("StringBuilder cost {"+(te5 - ts5)+"} ms");
   }
}

總結:

  1.用+的方式效率最差,concat由於是內部機制實現,比+的方式好了不少。

  2.Join和StringBuffer,相差不大,Join方式要快些,可見這種JavaScript中快速拼接字符串的方式在Java中也非常適用。

  3.StringBuilder 的速度最快,但其有線程安全的問題,而且只有JDK5及以上的版本支持。

  4.String對象串聯的效率最慢,單線程下字符串的串聯用StringBuilder,多線程下字符串的串聯用StrngBuffer;

  5.在編譯階段就能夠確定的字符串常量,完全沒有必要創建String或StringBuffer對象。直接使用字符串常量的"+"連接操作效率最高(如:String str = “a” + “b” + “c”;)。

關於更多效率分析參考:https://www.cnblogs.com/lojun/articles/9664794.html

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