变量应该在循环内部还是外部声明? [复制]
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 函数外部还是内部完成