public class JavapTip {
public static void main(String []args) { } private static String withStrings(int count) { String s = ""; for (int i = 0; i < count; i++) { s += i; } return s; } private static String withStringBuffer(int count) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < count; i++) { sb.append(i); } return sb.toString(); } } 现在让我们看看对这个类使用?Cc 选项运行 javap 的输出。-c 选项告诉 javap 反汇编在类中遇到的字节代码。 运行方式如下: >javap -c JavapTip 此命令的输出为: Method java.lang.String withStrings(int) 0 ldc #2 2 astore_1 3 iconst_0 4 istore_2 5 goto 30 8 new #3 11 dup 12 invokespecial #4 15 aload_1 16 invokevirtual #5 19 iload_2 20 invokevirtual #6 23 invokevirtual #7 26 astore_1 27 iinc 2 1 30 iload_2 31 iload_0 32 if_icmplt 8 35 aload_1 36 areturn Method java.lang.String withStringBuffer(int) 0 new #3 3 dup 4 invokespecial #4 7 astore_1 8 iconst_0 9 istore_2 10 goto 22 13 aload_1 14 iload_2 15 invokevirtual #6 18 pop 19 iinc 2 1 22 iload_2 23 iload_0 24 if_icmplt 13 27 aload_1 28 invokevirtual #7 31 areturn 如果你以前没有看过 Java 汇编器,那么这个输出对你来说就会比较难懂,但是你应该可以看到 withString 方法在每次循环的时候都新创建了一个 StringBuffer 实例。然后它将已有的 String 的当前值追加到 StringBuffer 上,然后追加循环的当前值。最后,它对 buffer 调用 toString 并将结果赋给现有的 String 引用。 withStringBuffer 方法与这个方法正好相反,在每次循环的时候 withStringBuffer 只调用现有 StringBuffer 的 append 方法,没有创建新的对象,也没有新的 String 引用。 红色字体部分很疑惑,求解答,谢谢 |