在Java中为for循环声明数组有多糟糕?

Pen*_*One 2 java memory-management

我来自C背景,所以我承认在用Java编写时我仍然在努力放弃内存管理.这个问题出现了几次,我很乐意对此进行详细阐述.以下是编写相同例程的两种方法,唯一的区别是何时double[] array声明:

代码示例1:

double[] array;
for (int i=0; i<n; ++i) {
    array = calculateSomethingAndReturnAnArray(i);
    if (someFunctionOnArrays(array)) {
        // DO ONE THING
    } else {
        // DO SOME OTHER THING
    }
}
Run Code Online (Sandbox Code Playgroud)

代码示例2:

for (int i=0; i<n; ++i) {
    double[] array = calculateSomethingAndReturnAnArray(i);
    if (someFunctionOnArrays(array)) {
        // DO ONE THING
    } else {
        // DO SOME OTHER THING
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,private double[] calculateSomethingAndReturnAnArray(int i)始终返回相同长度的数组.我强烈厌恶代码示例2,因为它只能覆盖现有数组时为每次迭代创建一个新数组.但是,我认为这可能是我应该坐下来让Java为我处理这种情况的时候之一.

偏好其中一种方式或者它们在Java中真正相同的原因是什么?

Mar*_*iot 8

这里的数组没什么特别的,因为你没有为数组分配,你只是创建一个新的变量,它相当于:

Object foo;
for(...){
    foo = func(...);
}
Run Code Online (Sandbox Code Playgroud)

在你在循环之外创建变量的情况下,变量(它将保存它引用的东西的位置)将只被分配一次,在你在循环内创建变量的情况下,变量可能在每次迭代中重新分配,但我的猜测是编译器或JIT将在优化步骤中修复它.

我认为这是一个微优化,如果你遇到代码段的问题,你应该根据测量而不是单独的规格做出决定,如果你没有遇到这个细分的问题代码,你应该做语义正确的事情,并在有意义的范围内声明变量.

另请参阅有关最佳做法的类似问题.