在循环内创建一个Object

Sam*_*rma 19 java oop loops object

在循环内创建Object是一个好习惯.我指向以下代码:

for(some condition){
    SomeClass a = new SomeClass ();
    System.out.println(a);
}
Run Code Online (Sandbox Code Playgroud)

因此,这将为每次迭代创建一个SomeClass的新实例.因此,实例数将等于迭代次数.然后这些将由GC收集.

在循环中重用SomeClass对象是否更好?像这样的东西:

SomeClass a = null;

for(some condition) {
    a = new SomeClass();
    System.out.println(a);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,第二种方式更好,因为这将只创建一次SomeClass对象,并将在每次迭代中重用它.但我很怀疑.请确认一下,或者让我知道我的基本面不正确的地方.

Sam*_*ica 13

区别在于,在第二种情况下,a当循环结束时,您的变量仍将在范围内

除此之外,它们基本上是相同的,即使从垃圾收集的角度来看也是如此.

字符串是引用类型(尽管是不可变的),无论是为它们声明一个新变量还是每次都覆盖相同的变量,它并不重要.你每次都在创造一个全新的字符串.

  • 请澄清"每次创建一个全新的字符串".我不记得创建任何字符串的OP代码的任何版本. (3认同)
  • 实际上,不,OP没有编辑它,其他人也没有.如果你检查编辑历史记录,那么从来没有一个版本执行过`new String`操作. (3认同)

Rai*_*olt 5

两者都创建了等量的字符串,因为它String是不可变的.无论何时为a String分配新值,String都会创建一个新值.

我们假设你打算在你的例子中使用一个可变对象.

选项1

for(some condition)
{
    Object o = new Object();
    System.out.println(o);
}
Run Code Online (Sandbox Code Playgroud)

这将为循环的每次迭代创建一个新的Object o.

选项2

Object o;
for(some condition)
{
    o = new Object();
    System.out.println(o);
}
Run Code Online (Sandbox Code Playgroud)

这将为Object循环的每次迭代创建一个新的o.

即使对于一个可变对象,你也可以得到相同的结果!


mon*_*nny 5

注意不要将'Object'本身和'Reference'混淆为'Object':

例如,以下代码创建(null)引用,但不创建任何对象.

Object a = null;
Run Code Online (Sandbox Code Playgroud)

以下代码创建了一个Object和对该对象的引用(引用保存在一个名为'a'的变量中):

Object a = new Object();
Run Code Online (Sandbox Code Playgroud)

下面的代码创建新的Object并'repoints'一个现有的(引用)变量指向新的Object:如果变量'a'已经拥有另一个引用,'a'就会忘记它.[但这并不意味着其他变量仍可能指向'a'引用的旧对象].

a = new Object(); // it is the reference 'a' that is 're-used' here not the object...
Run Code Online (Sandbox Code Playgroud)

每次在循环中重新运行上面的语句; 你确实在创造一个新的对象; 而你正在'重新指向''到那个新对象.

以前的参考文献(即'a'中的参考文献)每次都会被遗忘; 并且(假设我们这里有一个单线程程序)这意味着它指向的对象现在将有零引用指向它:这意味着该对象符合垃圾收集的条件.这个垃圾收集是否发生在这个时间点 - 我不知道我害怕.

但我会说:在垃圾收集发生的时候,你的编码例子没有区别; 是否已将"指针类型"定义为循环外的"对象",或者在循环内反复重新定义.

以下(无用的)示例可能有助于说明代码执行的"创建对象"和"点对象"操作之间的区别:

// This creates an object ; but we don't hold a reference to it.
    public class TestClass {
    public static void main(String[] args) {
    for (int n=0;n<100;n++) {
        new Object();
    }
    }
    }
Run Code Online (Sandbox Code Playgroud)

与之形成对比:

// This creates a reference ; but no object is created
// This is identical to setting the reference to 'null'.
public class TestClass {
public static void main(String[] args) {
for (int n=0;n<100;n++) {
        Object o;
}
}
}
Run Code Online (Sandbox Code Playgroud)