<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks
    What is the performance impact of the StringBuffer and String classes?

    Summary
    Reggie illuminates the underlying performance impact of using the StringBuffer and String classes when performing concatenations. (600 words)
    By Reggie Hutcherson

    Java provides the StringBuffer and String classes, and the String class is used to manipulate character strings that cannot be changed. Simply stated, objects of type String are read only and immutable. The StringBuffer class is used to represent characters that can be modified.

    The significant performance difference between these two classes is that StringBuffer is faster than String when performing simple concatenations. In String manipulation code, character strings are routinely concatenated. Using the String class, concatenations are typically performed as follows:

    String str = new String ("Stanford ");
    str += "Lost!!";

    If you were to use StringBuffer to perform the same concatenation, you would need code that looks like this:

    StringBuffer str = new StringBuffer ("Stanford ");
    str.append("Lost!!");

    Developers usually assume that the first example above is more efficient because they think that the second example, which uses the append method for concatenation, is more costly than the first example, which uses the + operator to concatenate two String objects.

    The + operator appears innocent, but the code generated produces some surprises. Using a StringBuffer for concatenation can in fact produce code that is significantly faster than using a String. To discover why this is the case, we must examine the generated bytecode from our two examples. The bytecode for the example using String looks like this:

    0 new #7
    3 dup
    4 ldc #2
    6 invokespecial #12
    9 astore_1
    10 new #8
    13 dup
    14 aload_1
    15 invokestatic #23
    18 invokespecial #13
    21 ldc #1
    23 invokevirtual #15
    26 invokevirtual #22
    29 astore_1

    The bytecode at locations 0 through 9 is executed for the first line of code, namely:

    String str = new String("Stanford ");

    Then, the bytecode at location 10 through 29 is executed for the concatenation:

    str += "Lost!!";

    Things get interesting here. The bytecode generated for the concatenation creates a StringBuffer object, then invokes its append method: the temporary StringBuffer object is created at location 10, and its append method is called at location 23. Because the String class is immutable, a StringBuffer must be used for concatenation.

    After the concatenation is performed on the StringBuffer object, it must be converted back into a String. This is done with the call to the toString method at location 26. This method creates a new String object from the temporary StringBuffer object. The creation of this temporary StringBuffer object and its subsequent conversion back into a String object are very expensive.

    In summary, the two lines of code above result in the creation of three objects:

    A String object at location 0
    A StringBuffer object at location 10
    A String object at location 26
    Now, let's look at the bytecode generated for the example using StringBuffer:

    0 new #8
    3 dup
    4 ldc #2
    6 invokespecial #13
    9 astore_1
    10 aload_1
    11 ldc #1
    13 invokevirtual #15
    16 pop

    The bytecode at locations 0 to 9 is executed for the first line of code:

    StringBuffer str = new StringBuffer("Stanford ");

    The bytecode at location 10 to 16 is then executed for the concatenation:

    str.append("Lost!!");

    Notice that, as is the case in the first example, this code invokes the append method of a StringBuffer object. Unlike the first example, however, there is no need to create a temporary StringBuffer and then convert it into a String object. This code creates only one object, the StringBuffer, at location 0.

    In conclusion, StringBuffer concatenation is significantly faster than String concatenation. Obviously, StringBuffers should be used in this type of operation when possible. If the functionality of the String class is desired, consider using a StringBuffer for concatenation and then performing one conversion to String.

    About the author
    Reggie Hutcherson is a Sun technology evangelist. He evangelizes Sun's Java 2 Platform technologies around the world concentrating on J2SE and the HotSpot performance engine.

    Resources

    "JavaWorld debuts new weekly Java performance column," Reggie Hutcherson (JavaWorld, March 2000):
    http://www.javaworld.com/jw-03-2000/jw-03-javaperf.html

    "The basics of Java performance," Reggie Hutcherson (JavaWorld, March 2000):
    http://www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html

    "Performance problem or design problem?" Reggie Hutcherson (JavaWorld, March 2000):
    http://www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html

    "Compiler optimizations," Reggie Hutcherson (JavaWorld, March 2000):
    http://www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html

    posted on 2005-09-12 09:25 javaGrowing 閱讀(443) 評論(0)  編輯  收藏 所屬分類: 好文收藏
    主站蜘蛛池模板: 在线A级毛片无码免费真人| 亚洲精品国产福利一二区| 在线视频免费观看高清| 又粗又硬又大又爽免费视频播放| 亚洲线精品一区二区三区| 午夜在线a亚洲v天堂网2019| a级日本高清免费看| 香蕉视频在线观看免费国产婷婷| 久久亚洲精品国产精品黑人| 羞羞视频免费网站含羞草| 青青视频观看免费99| 无码久久精品国产亚洲Av影片 | 免费人成网站在线高清| 色婷婷亚洲一区二区三区| 1000部免费啪啪十八未年禁止观看 | 亚洲国产成人一区二区三区| 亚洲欧美国产国产一区二区三区 | 国产香蕉免费精品视频| 国产成人麻豆亚洲综合无码精品| 亚洲精品无码久久久久久| 国产青草视频在线观看免费影院| 亚洲欧洲高清有无| 中国极品美軳免费观看| 国产免费观看黄AV片| 国产亚洲精品VA片在线播放| 免费激情视频网站| 久久国产精品免费| 亚洲免费视频一区二区三区| 99热在线日韩精品免费| 亚洲欧洲日韩在线电影| 中文字幕天天躁日日躁狠狠躁免费| 亚洲中文字幕无码一久久区| 最近中文字幕大全免费视频| 亚洲欧美国产国产一区二区三区| 久久久久亚洲AV成人网人人网站| 香港特级三A毛片免费观看| 精品亚洲一区二区| 性一交一乱一视频免费看| 国产性生大片免费观看性| 亚洲一线产区二线产区精华| 0588影视手机免费看片|