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