网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.心得:Spring 3种注入的比较分析.
.灵活使用EJB的本地和远程接口(二).
.在Java中使用Draw2D和SWT绘图.
.java对word、excel、pdf等操作综.
.用NetBeans平台开发J2ME游戏实例.
.Spring入门书籍.
.引用已定义过的包.
.JDBC2/3.0的特征点滴.
.Java的垃圾回收(Garbage Collec.
.java源代码分析----jvm.dll装载过.
.J2EE WEB应用架构分析(1).
.2006 IDE,谁将掀起风暴?.
.关于Java单元测试中的伪对象介绍.
.用JAVA开发CORBA应用实例.
.NLpack-eclipse-SDK-3.0.x-win32.
.浅论手机游戏发展趋势与相关 J2M.
.用Applet写的菜单程序 machine.
.我为什么没有使用Spring.
.Java十年有成——谈J2ME的发展历.
.网页软键盘,有效的防止监测键盘的.

用Javap反编译帮你理解Java特性

发表日期:2008-1-5



  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 引用。
上一篇:J2ME程序开发新手入门九大要点 人气:603
下一篇:AOP在大规模软件开发项目中应用的尝试与思考 人气:527
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐