【问题标题】:Should a variable be declared inside or outside a loop? [duplicate]变量应该在循环内部还是外部声明? [复制]
【发布时间】:2014-03-24 06:57:00
【问题描述】:

我想知道应该使用以下哪个:

String s = "";
List<String> list = new List<String>();
for(int i=0; i<100; i++){
    s = list.get(i);
    list.add(s);
}

List<String> list = new List<String>();
for(int i=0; i<100; i++){
    String s = list.get(i);
    list.add(s);
}

【问题讨论】:

  • 如果你不打算在循环外使用s,那么就不需要在循环外声明。
  • 我知道这只是举例,但循环内容中的逻辑错误让我抓狂(无效声明也好不到哪里去)。
  • 如果将 String 更改为任何 Object 怎么办?谢谢
  • 其实对象的类型并不重要。唯一的区别是,使用第一种方法,您将创建一个永远不会使用的空 String(浪费内存)。
  • 我回答你的问题了吗?

标签: java loops


【解决方案1】:

如今,这并不重要。编译器将执行若干优化,最终代码将是等效的。有一个最佳实践是说局部变量的范围应该总是尽可能小。在这种情况下,最好在循环中声明你的变量。

我建议你看看这个post

【讨论】:

    【解决方案2】:

    我会说这更像是一个设计的选择。

    您是否需要访问循环上下文之外的变量?如果是,前者是正确的,如果你只需要它在循环中处理,那么后者。

    我不是专家,但我会说如果您选择第一个选项然后不使用,您可能会延迟 GC。不过,GC 通常不会发生,除非您离开上下文。

    【讨论】:

      【解决方案3】:

      来自here

      答案是强调 str 绝对应该被声明 在while循环中。没有如果,没有与,没有但是。

      唯一可能违反此规则的情况是,如果出于某种原因 至关重要的是必须挤出每个时钟周期 的代码,在这种情况下,您可能需要考虑实例化 外部范围内的东西并重用它而不是重新实例化 它在内部范围的每次迭代中。但是,这并不适用 以您的示例为例,由于 java 中字符串的不变性:一个新的 str 的实例将始终在循环开始时创建 并且它必须在它结束时被扔掉,所以没有 在那里进行优化的可能性。

      区别如果变量是原始对象详细解释 @ 987654322@:

      对于素数...在循环外声明的变量你可以做到 不用担心性能受到影响。如果你喜欢它声明 在循环之外并希望获得尽可能好的性能 在外面声明它而不初始化它。

      for objects...如果在循环中声明了一个对象,则内存为 每次都分配对象并初始化 对象被执行。初始化可能不会花费太多时间 但内存分配会。在某些情况下,您可能无法 超越在每个循环中创建一个新对象,但如果可能的话 最好重置对象并重用它。

      【讨论】:

      【解决方案4】:

      对于字符串,我认为它不会影响性能,因为字符串是不可变的。 唯一“大”的事情是您在第一次更改s 的指针,而在第二次您每次都创建一个新指针。 但正如 Rohit Jain 评论的那样,如果您不打算在循环之外使用 s,请使用第二个。

      如果您在处理可变类型,我会选择第一个(取决于其余代码和其他一些元数据)

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 2019-09-23
        • 2015-04-12
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2016-12-05
        相关资源
        最近更新 更多