在循环中声明一个变量是不好的做法?在我看来,这样做,如下面的第一个代码块所示,将使用十倍的内存作为第二个...由于在循环的每次迭代中创建一个新的字符串。这是对的吗?
for (int i = 0; i < 10; i++) {
String str = "Some string";
}
VS
String str;
for (int i = 0; i < 10; i++) {
str = "Some String";
}
答案 0 :(得分:24)
在循环中声明一个变量是不好的做法吗?
完全没有!它将变量本地化为其使用点。
在我看来,这样做,如下面的第一个代码块所示,将使用十倍的内存作为第二个
编译器可以优化事物以保持内存使用效率。仅供参考:如果您使用final
关键字告诉您变量对某个对象有固定的引用,您可以提供帮助。
注意:如果你有一个更复杂的对象,你在构造函数中执行复杂的代码,那么你可能需要担心单次执行和多次执行,并在循环之外声明对象。
答案 1 :(得分:6)
在这两个示例中,您将实例化一个包含字符串“Some String”的新字符串对象相同的次数。
在第一个在循环内部声明str
的示例中,在for循环完成后,对该字符串的所有引用都将丢失,从而允许Java的垃圾收集器从内存中删除所有字符串实例。但是,在循环外部声明str
的第二个示例中,您创建的最后一个字符串仍将在循环外部引用它,而Java的垃圾收集器将仅删除10个字符串中的9个已实例化的内存。
因此,第一种方法更好,因为你没有保留字符串的任何引用,干扰垃圾收集器确定它是否仍在使用的能力。
答案 2 :(得分:2)
除了@Jason S所说的,我还鼓励你考虑代码的可读性。
例如,如果您只是一次写入引用,那么使用 intent 更清楚地使用以下内容:
String str = "write once";
while(condition){
//do stuff with str
}
对战:
String str = null;
while(condition){
str = "write once";
//do stuff with str
}
同样,如果字符串的值基于基于特定于循环迭代的内容,则在循环内声明变量。
答案 3 :(得分:1)
变量引用使用的内存很小。通常更好的做法是在循环中声明项目,因为它将更接近使用它的位置并且更具可读性。
答案 4 :(得分:0)
这取决于。假设你的编译器没有改变任何东西,效率低下来自创建String对象的开销。一旦超出范围,内存将被清除。