• String "+" 的补充说明---行粒度


    String 中“+” 的操作的补充说明

    在使用“+”的时候,会创建一个StringBuilder对象,然后invokevirtual append()操作

    “+”操作创建StringBuilder的粒度是行代码

    String str = a+b+c;

    这就是一行,这样他就会只new 一个StringBuider对象然后执行append操作,最后在调用toString()操作。

    下面是两个例子:

    public class Main{
        public static void main(String[]args){
            String a ="a",b="b",c="c";
            String d = a+b+c;
        }
    }

    这段简单代码的源码

      public static void main(java.lang.String[]);
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=5, args_size=1
             0: ldc           #2                  // String a
             2: astore_1      
             3: ldc           #3                  // String b
             5: astore_2      
             6: ldc           #4                  // String c
             8: astore_3      
             9: new           #5                  // class java/lang/StringBuilder
            12: dup           
            13: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
            16: aload_1       
            17: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            20: aload_2       
            21: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            24: aload_3       
            25: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            28: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            31: astore        4
            33: return        
          LineNumberTable:
            line 3: 0
            line 4: 9
            line 5: 33

    在上面字节码文件中可以看见只有一个new(第九行),然后就执行了相关append 操作。-----------行粒度,这里是一行。、

    下面设置为两行:

    1 public class Main{
    2     public static void main(String[]args){
    3         String a ="a",b="b",c="c";
    4         String d = a+b;
    5             d = d+c; //切为两行
    6     }
    7 }

    在次看看字节码

    public static void main(java.lang.String[]);
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=5, args_size=1
             0: ldc           #2                  // String a
             2: astore_1      
             3: ldc           #3                  // String b
             5: astore_2      
             6: ldc           #4                  // String c
             8: astore_3      
             9: new           #5                  // class java/lang/StringBuilder
            12: dup           
            13: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
            16: aload_1       
            17: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            20: aload_2       
            21: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            24: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            27: astore        4
            29: new           #5                  // class java/lang/StringBuilder
            32: dup           
            33: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
            36: aload         4
            38: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            41: aload_3       
            42: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            45: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            48: astore        4
            50: return        
          LineNumberTable:
            line 3: 0
            line 4: 9
            line 5: 29
            line 6: 50

    在 9 、29两行 new

  • 相关阅读:
    教你如何在Drcom下使用路由器上校园网(以广东工业大学、极路由1S HC5661A为例)
    selenium跳过webdriver检测并模拟登录淘宝
    无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口
    使用xib制作界面有时会出现button无法点击,解决办法
    1.开博客的第一篇
    6.关于瀑布模型
    3.Freshman阶段学习内容的确定
    7.Solution的Build、Rebuild和Clean
    4.词法结构JavaScript权威指南笔记
    8.对于.NET的初步理解和介绍
  • 原文地址:https://www.cnblogs.com/plxx/p/4521644.html
Copyright © 2020-2023  润新知