【问题标题】:Difference between defining variables inside and outside loops循环内外定义变量的区别
【发布时间】:2015-05-01 15:24:12
【问题描述】:

就风格或性能而言,在循环内还是在循环外定义变量更好?

例如:

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

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

如果您对变量声明的内部工作方式有任何见解,以及其中一个如何可能比另一个执行得更好(即使只是轻微的),请分享。而在性能之外,哪种风格更受欢迎?

【问题讨论】:

    标签: java performance coding-style


    【解决方案1】:

    内部

    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(final String variable : array) {
    }
    
    • 只分配一次(需要来源)
    • 限制变量范围。
    • 看起来棒极了。

    性能

    运行了以下测试。运行大约需要 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

    【讨论】:

    • 我会在 outside 中补充一点,如果他在一个方法中命名一个 var 与它在外部的另一个 var 同名,那么当使用该 var 时,范围仅本地。
    • 还可以添加将其添加到 for 语句本身的选项。限制范围,但分配只进行一次。
    • @Shondeslitch 我没有关注。
    • 就个人而言,我尽可能使用foreach
    • @apangin 更新以反映这些细节。
    【解决方案2】:

    您应该只在 for 循环头中定义 for 循环初始化变量,以限制其在循环内的范围。如果您关心性能,那么您应该在循环中定义变量。

    仅当您也在循环外使用该变量的值时,才在循环外定义变量。

    【讨论】:

      【解决方案3】:

      嗯,这取决于变量的主要用途,如果你在循环中定义一个变量,你需要在第一次使用变量之前初始化变量,并且在每个循环运行,变量将被重新初始化为这个值。

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

      【讨论】:

      • 我认为你是对的,但我不记得是否也可以在循环内声明一个静态变量,使其值在不同的运行中保持不变。
      • 不,循环中不允许使用静态变量,如果您希望该值在循环的不同运行中保持不变,则无论如何都不需要静态变量。只需简单地在外面声明即可。
      【解决方案4】:

      如果您在 for 循环内声明变量,您将无法在循环外访问它。

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

      你不能在循环外访问 var。

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        这比每次都创建一个新的 StringBuilder 效率更高。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-13
          • 2017-07-16
          • 1970-01-01
          • 2012-12-02
          • 2011-07-05
          • 1970-01-01
          • 2018-05-17
          相关资源
          最近更新 更多