程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java字符串拼接與機能剖析詳解

java字符串拼接與機能剖析詳解

編輯:關於JAVA

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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved