Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16493474
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:45:43

下载本文示例代码
  Java 开发人员熟悉在一个循环中使用StringBuffer 来代替串联 String 对象能获得最佳性能。然而,多数开发人员从来没有比较两种方法产生的字节代码的区别。在 Java 开发工具包(JDK)中有一个叫做 javap 的工具可以告诉你为什么这样做可以获得最佳性能。    Javap 将一个类和它的方法的一些转储信息输出到标准输出。该工具不把代码反编译为 java 源代码,但是它会把字节代码反汇编成为由 Java 虚拟机规范定义的字节代码指令。    在你需要查看编译器为你或者给你做了什么的时候,或者你想要看一处代码的改动对编译后的类文件有什么影响的时候,javap 相当有用。    现在以我们前面提到的 StringBuffer 和 String 作为一个例子。下面是一个专门为例子设计的类,它有两个方法,都返回一个由0到 n 的数字组成的 String,其中 n 由调用者提供。两个方法唯一的区别在于一个使用 String 构建结果,另外一个使用 StringBuffer 构建结果。     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 引用。    在这种情况下,我们已经知道了使用 StringBuffer 代替 String 是一种好的做法,但是如果我们不知道呢?那么 javap 可以帮助我们找到答案。在这里你可以看到更详细的关于String,StringBuffer 的解释    你并不会经常需要一个 Java 反汇编器,但是当你需要的时候,知道你自己的机器已经有一个并且用法相当简单的反汇编器当然是一件好事。如果你感兴趣,看书看看 javap 的其它选项——或许你会发现在你的环境中需要的特性。 编辑推荐:Java集成开工具专区   Java 开发人员熟悉在一个循环中使用StringBuffer 来代替串联 String 对象能获得最佳性能。然而,多数开发人员从来没有比较两种方法产生的字节代码的区别。在 Java 开发工具包(JDK)中有一个叫做 javap 的工具可以告诉你为什么这样做可以获得最佳性能。    Javap 将一个类和它的方法的一些转储信息输出到标准输出。该工具不把代码反编译为 java 源代码,但是它会把字节代码反汇编成为由 Java 虚拟机规范定义的字节代码指令。    在你需要查看编译器为你或者给你做了什么的时候,或者你想要看一处代码的改动对编译后的类文件有什么影响的时候,javap 相当有用。    现在以我们前面提到的 StringBuffer 和 String 作为一个例子。下面是一个专门为例子设计的类,它有两个方法,都返回一个由0到 n 的数字组成的 String,其中 n 由调用者提供。两个方法唯一的区别在于一个使用 String 构建结果,另外一个使用 StringBuffer 构建结果。     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 引用。    在这种情况下,我们已经知道了使用 StringBuffer 代替 String 是一种好的做法,但是如果我们不知道呢?那么 javap 可以帮助我们找到答案。在这里你可以看到更详细的关于String,StringBuffer 的解释    你并不会经常需要一个 Java 反汇编器,但是当你需要的时候,知道你自己的机器已经有一个并且用法相当简单的反汇编器当然是一件好事。如果你感兴趣,看书看看 javap 的其它选项——或许你会发现在你的环境中需要的特性。 编辑推荐:Java集成开工具专区 下载本文示例代码


用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性用Javap反编译帮你理解Java特性
阅读(199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~