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
当循环结束时,您的变量仍将在范围内
除此之外,它们基本上是相同的,即使从垃圾收集的角度来看也是如此.
字符串是引用类型(尽管是不可变的),无论是为它们声明一个新变量还是每次都覆盖相同的变量,它并不重要.你每次都在创造一个全新的字符串.
两者都创建了等量的字符串,因为它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.
即使对于一个可变对象,你也可以得到相同的结果!
注意不要将'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)