假设我需要迭代某些东西并在每个循环中设置一个变量,如下所示:
for (int i=0; i < list.size(); i++) {
final Object cur = list.get(i);
}
每次重新定义变量,所以我担心这可能会污染内存。
备用选项是定义变量一次,然后在每次迭代时重新分配它,如下所示:
Object cur
for (int i=0; i < list.size(); i++) {
cur = list.get(i);
}
在内存方面会更好吗?会有什么不同吗?如果cur
是基本类型而不是对象怎么办?
不要告诉我使用foreach,我需要计数器,这只是一个简化的例子
答案 0 :(得分:3)
从性能的角度来看,我会说如果您需要来改善这一点(您测量的是热点在这里),您可以选择提供最佳性能的解决方案。
那就是说,我建议把它放在里面循环中,以免你在外面错误地使用它。
顺便说一下,如果不知道是否应该在循环之外使用变量,那么你就可以简化调试和可读性。答案 1 :(得分:3)
它对性能没有影响。两者都很好。事实证明,它们被编译成类似的字节码,如本博客文章所指出的那样:(http://livingtao.blogspot.in/2007/05/myth-defining-loop-variables-inside.html)
答案 2 :(得分:0)
我建议您使用替代方法 - 声明变量 - 循环外的原语或对象。但是,我在您的第一种方法中注意到您使用final
关键字声明了该对象。这应该给编译器一个提示,以便以运行时内存利用率尽可能低的方式优化代码。但你不应该依赖它。只需使用您的替代方法。
答案 3 :(得分:0)
认真地使用你想要的任何东西,它没有区别。唯一的区别是该变量的范围 - 例如,当变量GC
在循环内部时,它会更容易推理 - 因为它基本上不能&#34;逸出&#34;循环。
答案 4 :(得分:0)
程序的性能取决于代码生成输出所花费的时间,而执行代码需要更多时间的语句/循环/条件很自然,代码的和平将消耗更少的内存,而其他代码则需要更少的内存时间来产生输出。
根据您的代码问题,在每次迭代时为第一个循环语句分配最终对象与第二个循环语句相比需要更多时间,而第二个循环语句分配给同一个对象每一次。
我在本地linux(Ubuntu)框中尝试过,第一个语句需要18毫秒而第二个语句只需要15秒,所以我猜第二个语句会更合适。
我在本地尝试的代码:
import java.util.ArrayList;
import java.util.List;
public class Solution8 {
public static void main(String[] args) {
List<String> lis = new ArrayList<String>();
for (int i = 0; i <= Math.pow(10, 5); i++) {
lis.add(i + "");
}
long startTime = System.currentTimeMillis();
for (int i = 0; i <= Math.pow(10, 5); i++) {
final Object cur1 = lis.get(i);
}
long endTime = System.currentTimeMillis();
System.out.println("1st : "+(endTime-startTime)); // 18 milliseconds
Object cur;
long startTime2 = System.currentTimeMillis();
for (int i = 0; i <= Math.pow(10, 5); i++) {
cur = lis.get(i);
}
long endTime2 = System.currentTimeMillis();
System.out.println("2nd : "+(endTime2-startTime2)); // 15 milliseconds
}
}
希望这会有所帮助。