java字符串拼接與機能剖析詳解。本站提示廣大學習愛好者:(java字符串拼接與機能剖析詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java字符串拼接與機能剖析詳解正文
假定有一個字符串,我們將對這個字符串做年夜量輪回拼接操作,應用”+”的話將獲得最低的機能。然則畢竟這特性能有多差?假如我們同時也把StringBuffer,StringBuilder或String.concat()放入機能測試中,成果又會若何呢?本文將會就這些成績給出一個謎底!
我們將應用Per4j來盤算機能,由於這個對象可以給我們一個完全的機能目標聚集,好比最小,最年夜耗時,統計時光段的尺度誤差等。在測試代碼中,為了獲得一個精確的尺度誤差值,我們將履行20個拼接”*”50,000次的測試。上面是我們將應用到的拼接字符串的辦法:
Concatenation Operator (+)
String concat method – concat(String str)
StringBuffer append method – append(String str)
StringBuilder append method – append(String str)
最初,我們將看看字節碼,來研討這些辦法究竟是若何履行的。如今,讓我們先開端來創立我扪的類。留意為了盤算每一個輪回的機能,代碼中的每段測試代碼都須要用Per4J庫停止封裝。起首我們先界說迭代次數
private static final int OUTER_ITERATION=20;
private static final int INNER_ITERATION=50000;
接上去,我們將應用上述4個辦法來完成我們的測試代碼。
String addTestStr = "";
String concatTestStr = "";
StringBuffer concatTestSb = null;
StringBuilder concatTestSbu = null;
for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
StopWatch stopWatch = new LoggingStopWatch("StringAddConcat");
addTestStr = "";
for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
addTestStr += "*";
stopWatch.stop();
}
for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
StopWatch stopWatch = new LoggingStopWatch("StringConcat");
concatTestStr = "";
for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
concatTestStr.concat("*");
stopWatch.stop();
}
for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
StopWatch stopWatch = new LoggingStopWatch("StringBufferConcat");
concatTestSb = new StringBuffer();
for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
concatTestSb.append("*");
stopWatch.stop();
}
for (int outerIndex=0;outerIndex<=OUTER_ITERATION;outerIndex++) {
StopWatch stopWatch = new LoggingStopWatch("StringBuilderConcat");
concatTestSbu = new StringBuilder();
for (int innerIndex=0;innerIndex<=INNER_ITERATION;innerIndex++)
concatTestSbu.append("*");
stopWatch.stop();
}
接上去經由過程運轉法式來生成機能目標。我的運轉情況是64位的Windown7操作體系,32位的JVM(7-ea) 帶4GB內存,雙核Quad 2.00GHz的CPU的機械
成果異常完善如我們想象的那樣。獨一比擬風趣的工作是為何String.concat也很不錯,我們都曉得,String是一個常類(初始化後就不會轉變的類),那末為何concat的機能會更好一些呢。(譯者注: 其實原文作者的測試代碼有成績,關於concat()辦法的測試代碼應當寫成 concatTestStr=concatTestStr.concat(“*”)才對。)為了答復這個成績,我們應當看看concat反編譯出來的字節 碼。在本文的下載包外面包括了一切的字節碼,然則如今我們先看一下concat的這個代碼片斷:
46: new #6; //class java/lang/StringBuilder
49: dup
50: invokespecial #7; //Method java/lang/StringBuilder."<init>":()V
53: aload_1
54: invokevirtual #8; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
57: ldc #9; //String *
59: invokevirtual #8; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
62: invokevirtual #10; //Method java/lang/StringBuilder.toString:()
Ljava/lang/String;
65: astore_1
66: iinc 7, 1
69: goto 38
這段代碼是String.concat()的字節碼,從這段代碼中,我們可以清晰的看到,concat()辦法應用了 StringBuilder,concat()的機能應當和StringBuilder的一樣好,然則因為額定的創立StringBuilder和 做.append(str).append(str).toString()的操作,使得concate的機能會遭到一些影響,所以 StringBuilder和String Cancate的時光是1.8和3.3。
是以,即時在做最簡略的拼接時,假如我們不想創立StringBuffer或StringBuilder實例使,我們也因該應用concat。然則關於年夜量的字符串拼接操作,我們就不該該應用concat(譯者注:因 為測試代碼功效上其實不完整等價,改換後的測試代碼concat的均勻處置時光是1650.9毫秒。這個成果在原文的評論外面。),由於concat會下降 你法式的機能,消費你的cpu。是以,在不斟酌線程平安和同步的情形下,為了取得最高的機能,我們應盡可能應用StringBuilder。