从指令看出new String(“hello1”),这个创建了2个对象
public void anew(){ String str = new String("hello1"); }
0 new #14 <java/lang/String> // 第2个对象 3 dup 4 ldc #15 <hello1> // 第1个对象 6 invokespecial #16 <java/lang/String.<init>> 9 astore_1 10 return
public void notnew(){ String str = "hello2"; }
0 ldc #17 <hello2> 2 astore_1 3 return
public void notnew2(){ String str = new StringBuilder("Hello").append("World").toString(); }
0 new #2 <java/lang/StringBuilder> 3 dup 4 ldc #3 <Hello> 6 invokespecial #4 <java/lang/StringBuilder.<init>> 9 ldc #5 <World> 11 invokevirtual #6 <java/lang/StringBuilder.append> 14 invokevirtual #7 <java/lang/StringBuilder.toString> 17 astore_1 18 return
public void notnew3(){ String str = "a"+"b"; }
从指令,可以看出"a"+“b”,已经被优化了
0 ldc #18 <ab> 2 astore_1 3 return
public void notnew4(){ String a = "a"; String b = "b"; String str = a+b; }
从指令可以看出a+b,使用的是StringBuilder对象操作
0 ldc #19 <a> 2 astore_1 3 ldc #20 <b> 5 astore_2 6 new #2 <java/lang/StringBuilder> 9 dup 10 invokespecial #10 <java/lang/StringBuilder.<init>> 13 aload_1 14 invokevirtual #6 <java/lang/StringBuilder.append> 17 aload_2 18 invokevirtual #6 <java/lang/StringBuilder.append> 21 invokevirtual #7 <java/lang/StringBuilder.toString> 24 astore_3 25 return