分析一个小Java程序

public static void recursive(StringBuilder sb, String s,int len){
  if(len<=0){
   System.out.println("end");
  } else{
   sb.append(s).append(len).append("_");
   recursive(sb,s,len-1);
  }
 }
 
 public static String iterative(String s, int len){
  StringBuilder sb = new StringBuilder();
  while(len-->0) {
   sb.append(s).append(len).append("_");
  }
  return sb.toString();
 }
 
 public static void testIterative(){
  Runtime.getRuntime().addShutdownHook(new Thread(){
   public void run(){
    long duration = System.currentTimeMillis() - t0;
    System.out.println("really duration: " + duration);
   }
  });
  System.out.println(iterative("a",MAXROUND));
 }
 
 public static void testRecursive(){
  StringBuilder sb = new StringBuilder();
  recursive(sb,"a",MAXROUND);
  System.out.println(sb);
 }

 public static void main(String[] args){
  t0 = System.currentTimeMillis();
  //testRecursive();
  testIterative();
  
  long duration = System.currentTimeMillis() - t0;
  
  System.out.println("========== duration ==========");
  System.out.println(duration);

  System.out.println("========== end ==========");

 } 

结果:
duration: 500
really duration: 600

这里说明几个问题:
一. 迭代通常比递归带来更好的性能,还有空间利用率小的优势, 主要缺点就是编写困难了些.
递归中函数上下文信息要全部存入栈中,当递归深度过大时会造成OutOfMemeory异常.

二. 字符数据放在打印缓冲队列中等待打印,而程序逻辑继续运行,所以打印之后的语句是500

而程序在退出之前必须等待缓冲打印完毕,所以在shutdown钩子中,真实时间为600.

posted on 2007-07-25 17:40  彭帅  阅读(698)  评论(0编辑  收藏  举报