String拼接字符串的奥秘

1、String拼接字符串,什么时候不能用“+”?

 @Test
    public void test01(){
        String str = "hello";
        str += ",";
        str += "world";
    }

对应的字节码文件:

public test01()V
  @Lorg/junit/Test;()
   L0
    LINENUMBER 8 L0
    LDC "hello"
    ASTORE 1
   L1
    LINENUMBER 9 L1
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC ","
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 1
   L2
    LINENUMBER 10 L2
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC "world"
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 1
   L3
    LINENUMBER 11 L3
    RETURN
   L4
    LOCALVARIABLE this Lcom/zm/MyTest/StrTest; L0 L4 0
    LOCALVARIABLE str Ljava/lang/String; L1 L4 1
    MAXSTACK = 2
    MAXLOCALS = 2

  从以上字节码文件中看出, NEW java/lang/StringBuilder出现了两次。说明,我们每拼接一次字符串,就会创建一个 StringBuilder对象。如果我们是在一个循环中进行字符串拼接,就会创建多个StringBuilder对象,造成系统的巨大浪费,影响性能。

2、String拼接字符串,什么时候能用“+”?

  @Test
    public void test02(){
        String sql = "select * from employee"+" where empNo="+1001;
    }

对应的字节码文件:

public test02()V
  @Lorg/junit/Test;()
   L0
    LINENUMBER 15 L0
    LDC "select * from employee where empNo=1001"
    ASTORE 1
   L1
    LINENUMBER 16 L1
    RETURN
   L2
    LOCALVARIABLE this Lcom/zm/MyTest/StrTest; L0 L2 0
    LOCALVARIABLE sql Ljava/lang/String; L1 L2 1
    MAXSTACK = 1
    MAXLOCALS = 2

  从以上字节码中看出,没有任何创建 StringBuilder 的指令,而是直接从常量池中取出了一个完整的字符串:select * from employee where empNo=1001, Java 编译器自动对代码进行了优化。

总结:
  1、在循环和多个表达式中不能使用 +,因为StringBuilder频繁创建性能影响;
  2、在单个表达式中可以用 +,编译器直接做了优化;

参考自:https://mp.weixin.qq.com/s/7xEjUyGjazL4Rm1xTIoRAw

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值