关于String连接(+运算符)

1.代码

package lan.jdk.study;

public class StringTest {
    
    private String name;
    private String address;
    
    public static void main(String[] args) {
        String s = "";
        for(int i = 1; i < 1000000; i++){
            s += i;
        }
    }

    @Override
    public String toString() {
        return "StringTest [name=" + name + ", address=" + address + "]";
    }

}

 记得刚学java的时候,如上代码中的s+=i;应该用StringBuilder的append方法来完成,从而避免生成很多String对象,

而在jdk1.6中,s+=i;这种代码会自动被编译器优化,通过反编译代码,可的到如下结果

Compiled from "StringTest.java"
public class lan.jdk.study.StringTest extends java.lang.Object{
public lan.jdk.study.StringTest();
  Code:
   0:   aload_0
   1:   invokespecial   #11; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   ldc     #19; //String
   2:   astore_1
   3:   iconst_1
   4:   istore_2
   5:   goto    30
   8:   new     #21; //class java/lang/StringBuilder
   11:  dup
   12:  aload_1
   13:  invokestatic    #23; //Method java/lang/String.valueOf:(Ljava/lang/Objec
t;)Ljava/lang/String;
   16:  invokespecial   #29; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
   19:  iload_2
   20:  invokevirtual   #32; //Method java/lang/StringBuilder.append:(I)Ljava/la
ng/StringBuilder;
   23:  invokevirtual   #36; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
   26:  astore_1
   27:  iinc    2, 1
   30:  iload_2
   31:  ldc     #40; //int 1000000
   33:  if_icmplt       8
   36:  return

public java.lang.String toString();
  Code:
   0:   new     #21; //class java/lang/StringBuilder
   3:   dup
   4:   ldc     #47; //String StringTest [name=
   6:   invokespecial   #29; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
   9:   aload_0
   10:  getfield        #49; //Field name:Ljava/lang/String;
   13:  invokevirtual   #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
   16:  ldc     #54; //String , address=
   18:  invokevirtual   #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
   21:  aload_0
   22:  getfield        #56; //Field address:Ljava/lang/String;
   25:  invokevirtual   #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
   28:  ldc     #58; //String ]
   30:  invokevirtual   #51; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;
   33:  invokevirtual   #36; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
   36:  areturn

}

 可以看jdk会自动优化String相加的代码,因此代码中直接用+操作连接字符串即可,以增加代码可读性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值