变量应该在循环内部还是外部声明? [复制]

Posted

技术标签:

【中文标题】变量应该在循环内部还是外部声明? [复制]【英文标题】: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(浪费内存)。 我回答你的问题了吗? 【参考方案1】:

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

我建议你看看这个post。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

来自here:

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

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

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

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

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

【讨论】:

第二个链接坏了。现在这似乎是正确的:community.oracle.com/blogs/ddevore/2006/08/21/…【参考方案4】:

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

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

【讨论】:

以上是关于变量应该在循环内部还是外部声明? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 android studio java 代码中在哪里声明视图?声明应该在 onCreate 函数外部还是内部完成

应该尝试...catch 进入循环内部还是外部?

在java中应该在循环内还是循环外声明变量[重复]

安装jmeter 环境变量都配置好了 可还是出现不是内部外部命令

将Usings放在命名空间内部还是外部? [复制]

FILTER 应该在 SUMMARIZE 内部还是外部使用?