国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

String、StringBuilder、StringBuffer 拼接測試

20171112 / 2543人閱讀

摘要:測試拼接速度測試的結(jié)果在循環(huán)中,拼接字符串的速度遠(yuǎn)低于和利用查看字節(jié)碼文件,尋找其中的差異命令行執(zhí)行結(jié)果可以看出,拼接的時(shí)候也是通過的方法進(jìn)行拼接的產(chǎn)生差異的原因是,在每次循環(huán)中,拼接的時(shí)候都了一個(gè)是線程安全的,只比稍慢了一點(diǎn)若不是

String、StringBuilder、StringBuffer 測試拼接速度
@Test
public void testString() {
    long before = System.currentTimeMillis();
    String s = "";
    for (int i = 0; i < 100000; i++) {
        s += "a";
    }
    long after = System.currentTimeMillis();
    System.out.println("String cost: " + (after - before));
}

@Test
public void testStringBuilder() {
    long before = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 100000; i++) {
        sb.append("a");
    }
    long after = System.currentTimeMillis();
    System.out.println("StringBuilder cost: " + (after - before));
}

@Test
public void testStringBuffer() {
    long before = System.currentTimeMillis();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 100000; i++) {
        sb.append("a");
    }
    long after = System.currentTimeMillis();
    System.out.println("StringBuffer cost: " + (after - before));
}

測試的結(jié)果:

    StringBuilder cost: 5
    StringBuffer cost: 9
    String cost: 14029

在循環(huán)中,String 拼接字符串的速度遠(yuǎn)低于 StringBuilder 和 StringBuffer

利用 javap 查看字節(jié)碼文件,尋找其中的差異

命令行執(zhí)行

javap -c StringTest.class

結(jié)果可以看出,String 拼接的時(shí)候也是通過 StringBuilder 的 append 方法進(jìn)行拼接的

產(chǎn)生差異的原因是,在每次循環(huán)中,String 拼接的時(shí)候都 new 了一個(gè) StringBuilder

StringBuffer 是線程安全的,只比 StringBuilder 稍慢了一點(diǎn)

public void testString();
Code:
0: ldc           #2                  // String
2: astore_1
3: iconst_0
4: istore_2
5: iload_2
6: ldc           #11                 // int 100000
8: if_icmpge     37
11: new           #4                  // class java/lang/StringBuilder
14: dup
15: invokespecial #5                  // Method java/lang/StringBuilder."":()V
18: aload_1
19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: ldc           #9                  // String a
24: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: astore_1
31: iinc          2, 1
34: goto          5
37: return

public void testStringBuilder();
Code:
0: new           #4                  // class java/lang/StringBuilder
3: dup
4: invokespecial #5                  // Method java/lang/StringBuilder."":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: ldc           #11                 // int 100000
13: if_icmpge     29
16: aload_1
17: ldc           #9                  // String a
19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: pop
23: iinc          2, 1
26: goto          10
29: return

public void testStringBuffer();
Code:
0: new           #12                 // class java/lang/StringBuffer
3: dup
4: invokespecial #13                 // Method java/lang/StringBuffer."":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: ldc           #11                 // int 100000
13: if_icmpge     29
16: aload_1
17: ldc           #9                  // String a
19: invokevirtual #14                 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
22: pop
23: iinc          2, 1
26: goto          10
29: return

若不是循環(huán),String 和 StringBuilder 拼接的速度是差不多的

java 測試代碼

@Test
public void string() {
    String s = "";
    String ss = "cc";
    s += "a" + "b" + ss;
}
    
@Test
public void stringBuilder() {
    StringBuilder sb = new StringBuilder();
    String ss = "cc";
    sb.append("a").append("b").append(ss);
}

字節(jié)碼

public void string();
Code:
0: ldc           #2                  // String
2: astore_1
3: ldc           #3                  // String cc
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: ldc           #7                  // String ab
19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: aload_2
23: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29: astore_1
30: return

public void stringBuilder();
Code:
0: new           #4                  // class java/lang/StringBuilder
3: dup
4: invokespecial #5                  // Method java/lang/StringBuilder."":()V
7: astore_1
8: ldc           #3                  // String cc
10: astore_2
11: aload_1
12: ldc           #9                  // String a
14: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: ldc           #10                 // String b
19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: aload_2
23: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: pop
27: return

原因是同樣只 new 了一個(gè) StringBuilder,使用的也是它的 append 方法

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67263.html

相關(guān)文章

  • 從字節(jié)碼角度看StringStringBuffer、StringBuilder的不同

    摘要:官方說明將一個(gè)或多個(gè)類文件進(jìn)行分解。顯示靜態(tài)常量為每個(gè)類中的方法打印反匯編代碼例如字節(jié)碼指令組成。在結(jié)果的行直接進(jìn)行多次的拼接看看最后編譯會是神馬的這句話是對應(yīng)聲明了一個(gè),然后每次拼接實(shí)際使用的是的方法。 Oracle官方說明: javap 將一個(gè)或多個(gè)類文件進(jìn)行分解。 使用簡要說明 javap [options] classfile... options 命令行選項(xiàng),詳細(xì)查看后面...

    wua_wua2012 評論0 收藏0
  • 為什么不建議在for循環(huán)中使用"+"進(jìn)行字符串拼接

    摘要:使用可以方便的對字符串進(jìn)行拼接。該方法使用進(jìn)行聲明,說明是一個(gè)線程安全的方法。所以,阿里巴巴開發(fā)手冊建議循環(huán)體內(nèi),字符串的連接方式,使用的方法進(jìn)行擴(kuò)展。但是,還要強(qiáng)調(diào)的是如果不是在循環(huán)體中進(jìn)行字符串拼接的話,直接使用就好了。 摘要: 學(xué)習(xí)阿里巴巴Java開發(fā)手冊。 原文:為什么阿里巴巴不建議在for循環(huán)中使用+進(jìn)行字符串拼接 微信公眾號:Hollis Fundebug經(jīng)授權(quán)轉(zhuǎn)載,...

    caoym 評論0 收藏0
  • Java 字符串拼接效率分析及最佳實(shí)踐

    摘要:兩個(gè)字符串拼接直接調(diào)用性能最好。關(guān)于的其他最佳實(shí)踐用時(shí)總是把能確定不為空的變量寫在左邊,如使用判斷空串,避免空指針異常。在需要把其他對象轉(zhuǎn)換為字符串對象時(shí),使用而不是直接調(diào)用方法,因?yàn)榍罢咭呀?jīng)對空值進(jìn)行檢測了,不會拋出空指針異常。 本文來源于問題 Java字符串連接最佳實(shí)踐? java連接字符串有多種方式,比如+操作符,StringBuilder.append方法,這些方法各有什么優(yōu)...

    BakerJ 評論0 收藏0
  • StringStringBuilder、StringBuffer的愛恨情仇

    摘要:當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見對象的學(xué)習(xí) StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時(shí)并且也耗內(nèi)存(每次都會構(gòu)造一個(gè)新的string對象),而這種拼接操作又...

    stormjun 評論0 收藏0
  • StringString / StringBuffer / StringBuilder 三者的功能

    摘要:不指定容量會顯著降低性能一般使用在方法內(nèi)部來完成類似功能,因?yàn)槭蔷€程不安全的,所以用完以后可以丟棄。主要用在全局變量中相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風(fēng)險(xiǎn)。 String 作為最基礎(chǔ)的引用數(shù)據(jù)類型,日常的開發(fā)中被大量的使用。基于不可變的特性,一旦被過度地使用,堆內(nèi)存就會負(fù)荷不堪,甚至影響性能,為此,Java 設(shè)計(jì)者特意為 String 在方法區(qū)中開辟...

    icattlecoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<