Java – 在for循环中声明变量

在循环中声明一个变量是不好的做法? 在我看来,这样做,如下面的第一个代码块所示,将使用十倍的内存作为第二个…由于在循环的每次迭代中创建一个新的字符串。 它是否正确?

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对象的开销。 一旦超出范围,内存将被清除。