分析一个小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.