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、在单个表达式中可以用 +,编译器直接做了优化;