最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率

 更新時(shí)間:2023年12月11日 10:29:57   作者:紅袖添香  
這篇文章主要介紹了從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

又刷到這篇文章

為什么idea建議去掉StringBuilder,使用“+”拼接字符串

網(wǎng)上有很多文章用 JUnit 進(jìn)行測(cè)試驗(yàn)證,可以網(wǎng)上搜一下,這里不做贅述。今天我們從反編譯和字節(jié)碼的角度分析字符串拼接的時(shí)候底層到底做了什么

拼接場(chǎng)景

示例 1:

public class Hello2 {
    public static void main(String[] args) {
    }
    public void add1() {
        String a = "aaa" + "bbb" + "ccc";
        String b = new StringBuilder("aaa").append("bbb").append("ccc").toString();
    }
}

反編譯結(jié)果:

package com.noah.nowcoder;
public class Hello2 {
  public static void main(String[] args) {}
  public void add1() {
    String a = "aaabbbccc";
    String b = "aaa" + "bbb" + "ccc";
  }
}

Java 編譯器優(yōu)化(JDK 版本相關(guān)),編譯結(jié)果可以直接看出, String a = "aaa" + "bbb" + "ccc" 執(zhí)行效率更高;

示例 2:

public class Hello {
    public static void main(String[] args) {
        String str1 = "";
        for (int i = 0; i < 100000; i++) {
            str1 += "-" + UUID.randomUUID().toString();
        }
        System.out.println(str1);
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < 100000; ++i) {
            stringBuilder.append("-").append(UUID.randomUUID().toString());
        }
        System.out.println(stringBuilder.toString());
    }
}

反編譯結(jié)果:

package com.noah.nowcoder;
import java.util.UUID;
public class Hello {
  public static void main(String[] args) {
    String str1 = "";
    for (int i = 0; i < 100000; i++)
      str1 = str1 + "-" + UUID.randomUUID().toString(); 
    System.out.println(str1);
    StringBuilder stringBuilder = new StringBuilder();
    for (int j = 0; j < 100000; j++)
      stringBuilder.append("-").append(UUID.randomUUID().toString()); 
    System.out.println(stringBuilder.toString());
  }
}

這一步結(jié)果不明顯

字節(jié)碼信息

接下來(lái),我們看一下字節(jié)碼信息

Compiled from "Hello.java"
public class com.noah.nowcoder.Hello {
  public com.noah.nowcoder.Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String
       2: astore_1
       3: iconst_0
       4: istore_2
       5: iload_2
       6: ldc           #3                  // int 100000
       8: if_icmpge     46
      11: new           #4                  // class java/lang/StringBuilder
      14: dup
      15: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
      18: aload_1
      19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      22: ldc           #7                  // String -
      24: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      27: invokestatic  #8                  // Method java/util/UUID.randomUUID:()Ljava/util/UUID;
      30: invokevirtual #9                  // Method java/util/UUID.toString:()Ljava/lang/String;
      33: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      36: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      39: astore_1
      40: iinc          2, 1
      43: goto          5
      46: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      49: aload_1
      50: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      53: new           #4                  // class java/lang/StringBuilder
      56: dup
      57: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
      60: astore_2
      61: iconst_0
      62: istore_3
      63: iload_3
      64: ldc           #3                  // int 100000
      66: if_icmpge     91
      69: aload_2
      70: ldc           #7                  // String -
      72: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      75: invokestatic  #8                  // Method java/util/UUID.randomUUID:()Ljava/util/UUID;
      78: invokevirtual #9                  // Method java/util/UUID.toString:()Ljava/lang/String;
      81: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      84: pop
      85: iinc          3, 1
      88: goto          63
      91: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
      94: aload_2
      95: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      98: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
     101: return
}

注意:

15: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V

調(diào)用了 StringBuilder 構(gòu)造函數(shù),初始化了一個(gè) StringBuilder 對(duì)象(循環(huán)中初始化對(duì)象)

總結(jié)

根據(jù)字節(jié)碼改寫代碼

    public void add2() {
        String str1 = "";
        for (int i = 0; i < 100000; i++) {
            str1 += "-" + UUID.randomUUID().toString();
        }
        System.out.println(str1);
    }
    public void add3() {
        String str1 = "";
        for (int i = 0; i < 100000; i++) {
            StringBuilder stringBuilder = new StringBuilder();
            str1 = stringBuilder.append(str1).append("-").append(UUID.randomUUID().toString()).toString();
        }
        System.out.println(str1);
    }

字節(jié)碼文件:

public void add3();
    Code:
       0: ldc           #10                 // String
       2: astore_1
       3: iconst_0
       4: istore_2
       5: iload_2
       6: ldc           #11                 // int 100000
       8: if_icmpge     48
      11: new           #3                  // class java/lang/StringBuilder
      14: dup
      15: invokespecial #12                 // Method java/lang/StringBuilder."<init>":()V
      18: astore_3
      19: aload_3
      20: aload_1
      21: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      24: ldc           #13                 // String -
      26: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      29: invokestatic  #14                 // Method java/util/UUID.randomUUID:()Ljava/util/UUID;
      32: invokevirtual #15                 // Method java/util/UUID.toString:()Ljava/lang/String;
      35: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      38: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      41: astore_1
      42: iinc          2, 1
      45: goto          5
      48: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
      51: aload_1
      52: invokevirtual #17                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      55: return

從字節(jié)碼文件可以看出,add2() 和 add3() 基本上等價(jià)的。

所以循環(huán)中拼接字符串更高效的做法是將 StringBulider 放在循環(huán)外。

如下:

  public static void main(String[] args) {
    StringBuilder stringBuilder = new StringBuilder();
    for (int j = 0; j < 100000; j++)
      stringBuilder.append("-").append(UUID.randomUUID().toString()); 
    System.out.println(stringBuilder.toString());
  }

以上就是從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率的詳細(xì)內(nèi)容,更多關(guān)于java String拼接字符串效率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能

    java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Jmeter固定定時(shí)器的使用詳解

    Jmeter固定定時(shí)器的使用詳解

    jmeter提供了多種定時(shí)器以便于我們進(jìn)行接口的測(cè)試,你知道jmeter提供的定時(shí)器有哪些嗎,本文就詳細(xì)的介紹了Jmeter固定定時(shí)器的使用,感興趣的可以了解一下
    2021-11-11
  • SpringMVC集成Swagger實(shí)例代碼

    SpringMVC集成Swagger實(shí)例代碼

    本篇文章主要介紹了SpringMVC集成Swagger實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 簡(jiǎn)單了解Java方法的定義和使用實(shí)現(xiàn)詳解

    簡(jiǎn)單了解Java方法的定義和使用實(shí)現(xiàn)詳解

    這篇文章主要介紹了簡(jiǎn)單了解Java方法的定義和使用實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 深入解析Java的線程同步以及線程間通信

    深入解析Java的線程同步以及線程間通信

    這篇文章主要介紹了Java的線程同步以及線程間通信,多線程編程是Java學(xué)習(xí)中的重點(diǎn)和難點(diǎn),需要的朋友可以參考下
    2015-09-09
  • Java與JavaScript自動(dòng)化測(cè)試Selenium使用詳解

    Java與JavaScript自動(dòng)化測(cè)試Selenium使用詳解

    這篇文章主要介紹了Java與JavaScript自動(dòng)化測(cè)試Selenium的使用,Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具,Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣,需要的朋友可以參考下
    2025-05-05
  • 在SpringBoot下讀取自定義properties配置文件的方法

    在SpringBoot下讀取自定義properties配置文件的方法

    這篇文章主要介紹了在SpringBoot下讀取自定義properties配置文件的方法,文中涉及到了Spring-boot中讀取config配置文件的兩種方式,需要的朋友可以參考下
    2017-12-12
  • Java 虛擬線程實(shí)戰(zhàn)案例

    Java 虛擬線程實(shí)戰(zhàn)案例

    Java虛擬線線線線線程是一種輕量級(jí)的線程實(shí)現(xiàn),本文將深入探討 Java 虛擬線程的使用方法和實(shí)戰(zhàn)案例,幫助你更好地理解和應(yīng)用這一革命性的特性,感興趣的朋友一起看看吧
    2026-04-04
  • java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

    java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

    這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 詳解Java時(shí)區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat

    詳解Java時(shí)區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat

    這篇文章主要介紹了Java時(shí)區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat的區(qū)別于用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

博白县| 思茅市| 新乡县| 连江县| 中山市| 根河市| 喀什市| 定日县| 广德县| 禹州市| 永安市| 元谋县| 宜兰县| 湄潭县| 临沂市| 长阳| 东山县| 夏河县| 镇雄县| 昔阳县| 礼泉县| 祁门县| 通江县| 奇台县| 凤台县| 舟曲县| 武义县| 商都县| 旬邑县| 乌拉特前旗| 昌图县| 敖汉旗| 巴彦县| 丽水市| 苍南县| 台北县| 唐海县| 礼泉县| 荔浦县| 隆回县| 泾川县|