首页 新闻 会员 周边

javap反编译疑问

0
悬赏园豆:40 [待解决问题]
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 引用。


红色字体部分很疑惑,求解答,谢谢
新在路上的主页 新在路上 | 初学一级 | 园豆:130
提问于:2011-08-21 16:13
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册