最近才发现,Sun的JDK原来对尾递归支持得并不好。
思索源自:http://www.javaeye.com/topic/198999?page=1
动手试了一下:使用递归算法将是如果重复创建list这个大集合,将引起内存溢出:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
即便在递归中及时的把集合对象设成null,也会引起堆栈溢出:java.lang.StackOverflowError
测试代码如下:
//正常运行
public class ForLoopTest {
public static void main(String[] args) {
ForLoopTest t = new ForLoopTest();
System.out.println("==================== GO ====================");
for (int i = 0; i < 10000; i++){
t.a(0);
}
System.out.println("====================OVER====================");
}
public void a(int j) {
j++;
List list = new ArrayList
(100000);
}
}
//溢出
public class TailRecursionTest {
public static void main(String[] args) {
TailRecursionTest t = new TailRecursionTest();
System.out.println("==================== GO ====================");
t.a(0);
System.out.println("====================OVER====================");
}
public void a(int j) {
System.out.println(j);
j++;
if (j == 10000)
return;
List list = new ArrayList
(100000);
list = null;//即使gc友好也会溢出
a(j);
}
}