1

我对对象创建有一些疑问/问题。我听说不应该在循环中创建对象。在循环内创建对象有什么问题?在循环外创建和在循环内创建有什么区别?

请考虑以下示例。

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList =new java.util. ArrayList<Object>();
    Object obj = null;
    for(int i = 0 ; i <1000;i++){
        Object e = new Object(); //1 -->  Is this object creation wrong? 
        obj = new Object(); //2 --> Is this right way to create?
        objectList.add(e );

    }

    return objectList ;

}

请建议我必须遵循哪种方式?

4

4 回答 4

5

我听说不应该在循环中创建对象。在循环内创建对象有什么问题?

在循环中创建对象并没有错。有时它是创建多个(相关)对象的唯一方法。

在您的示例中,您可以简单地执行以下操作:

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList = new java.util. ArrayList<Object>();
    for(int i = 0 ; i <1000;i++){
        Object e = new Object(); 
        objectList.add(e);    
    }
    return objectList;
}
于 2012-07-06T07:32:55.693 回答
2

两种方法都是正确的,但区别在于范围 obj和垃圾收集。

public java.util.List<Object> objectCreationTest(){
java.util.List<Object> objectList =new java.util. ArrayList<Object>();
Object obj = null;
for(int i = 0 ; i <1000;i++){
    Object e = new Object(); //1 -->  Is this object creation wrong? 
    obj = new Object(); //2 --> Is this right way to create?
    objectList.add(e );

}

return objectList ;

}

如果 1 范围obj仅在 for 循环内,一旦循环完成,它将无法到达循环外,它将有资格进行垃圾收集。如果情况 2 范围obj也在循环之外。在您只是在收集方法 1 中插入对象的情况下更好,因为objectList如果您使用方法 2,插入后所有对象都将有资格进行垃圾收集,然后obj引用将在 i= 时创建的最后一个对象999 和收集器将检查obj后循环的引用是否可达意味着它扫描整个。

于 2012-07-06T07:55:48.470 回答
0

在你的情况下,你可以简单地这样做:

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList = new java.util. ArrayList<Object>();
    for(int i = 0 ; i <1000;i++){
        objectList.add(new Object());    
    }
    return objectList;
}
于 2012-07-06T07:36:08.330 回答
0

只是声明上的区别,实际创建上没有区别。理论上两者之间可能存在差异,但它是如此之小,编译器可能会接受它。

在您的示例中,您可以这样写:

public java.util.List<Object> objectCreationTest(){
    java.util.List<Object> objectList =new java.util. ArrayList<Object>();
    for(int i = 0 ; i <1000;i++){
        objectList.add(new Object());    
    }
    return objectList;
}
于 2012-07-06T07:36:49.453 回答