在循环内部和外部定义变量之间的区别

时间:2015-05-01 15:24:12

标签: java performance coding-style

在样式或性能方面,在循环内或外部定义变量是否更好?

例如:

int var;
for (...) {
    var = /*something*/;
    // Code that uses var
}

for (...) {
    int var = /*something*/;
    // Code that uses var
}

如果您对变量声明如何在内部工作有任何见解,以及其中一个声明如何比另一个更好(即使它只是稍微有点),请分享。在表演之外,哪种风格更受欢迎?

5 个答案:

答案 0 :(得分:5)

for(int i = 0; i < array.length; i++) {
   final String variable = array[i];
}
  • 保持变量范围有限。
  • 变量可以是最终的
  • 更具可读性(可能)

String variable;
for(int i = 0; i < array.length; i++) {
   variable = array[i];
}
  • 变量可在循环外访问。

For Each

for(final String variable : array) {
}
  • 仅分配一次(需要来源)
  • 保持变量范围有限。
  • 看起来很恐怖&#39;真棒。

性能

运行以下测试。运行大约需要30秒。结果表明,在循环内部或外部定义变量之间的性能没有差异。这很可能是由于编译器优化。 YMMV。

final double MAX = 1e7;

long start = System.nanoTime();
String var1;
for(double i = 0; i < MAX; i++) {
   var1 = UUID.randomUUID().toString();
}
System.out.println((System.nanoTime() - start) / 1e9);

start = System.nanoTime();
for(double i = 0; i < MAX; i++) {
   final String var2 = UUID.randomUUID().toString();
}
System.out.println((System.nanoTime() - start) / 1e9);

关于风格偏好的讨论:https://stackoverflow.com/a/8803806/1669208

答案 1 :(得分:1)

您应该仅为for循环标头定义for循环初始化变量,这限制了它在循环中的范围。如果您担心性能,那么您应该在循环中定义变量。

只有在循环外使用该变量的值时才定义变量外循环。

答案 2 :(得分:1)

那么,取决于主要如何使用变量,如果要在循环中定义变量,则需要在第一次使用变量之前初始化变量。循环运行时,变量将被重新初始化为此值。

另一方面,如果你想在循环中的不同运行中变量值保持,那么你必须在外面声明它。我不认为表演和风格可能是这里的主要标准。

答案 3 :(得分:0)

如果你在for循环中声明变量,你将无法在循环外部访问它。

for (...) {
    int var = /*something*/;
    // Code that uses var
}

你不能在循环外访问var。

int var;
for(...) {
    var = /*something*/;
    // Code that uses var
}

var可以在循环外访问。任何其他类代码都可以使用for循环中设置的var值。

这一切都取决于您的要求。

答案 4 :(得分:0)

你应该尝试将变量移出循环外的唯一一次,即使它从未在循环之外使用过,如果你可以重用一个对象,并避免在循环的每次迭代中使用new

StringBuilder builder = new StringBuilder();
for(...) {
    builder.append(..);
    builder.append(..);

    strings[i] = builder.toString();
    // reset builder, to be used again
    builder.setLength(0);
}

这比每次创建一个新的StringBuilder更有效。

在所有其他情况下,如果可以,您应该更喜欢在循环内声明变量