考虑这些类似的代码:
for (int iteration = 0; iteration<a_lot; iteration++) {
int[] re = new int[large];
for (int i = 0; i<large; i++)
re[i] = computeValue();
...
}
和
int[] re = new int[large];
for (int iteration = 0; iteration<a_lot; iteration++) {
for (int i = 0; i<large; i++)
re[i] = computeValue();
...
}
在第一个示例中,我们在每次迭代中为数组重新分配新空间,让垃圾收集器处理在前一次迭代中释放数组的空间,而在第二个示例中,我们重用相同的数组。 我可以想象,在某些情况下,第一个算法导致(或有助于)StackOverflowException,而第二个算法的缺点是数组永远不会在迭代之间进行垃圾收集,即使可能是在某些点之后迭代不再使用数组了。
在哪种情况下使用哪种算法更好?
答案 0 :(得分:1)
首先,为什么你认为你会得到StackOverflowException?该数组将存储在堆上(引用将在堆栈上)。 其次,GC在两种情况下都足够聪明,可以清理内存。实际上,一旦不需要引用,垃圾收集器就可以调用内存(它可以调用内存,同时还在方法中。)
答案 1 :(得分:1)
除非您的数组太大以至于每次迭代都必须解除分配,否则每次重新分配它都没有任何好处。