java创建对象建议

时间:2012-07-06 07:31:14

标签: java

我对于对象创建有一些疑问/问题。我听说过 不应在循环中创建对象。什么是创造的错误 循环内的对象?什么是在循环外创建之间的区别 并在循环内创建?

请考虑以下示例。

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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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 ;

}

如果obj的{​​1}范围仅在for循环内,则一旦循环完成,它将无法进行循环,它将有资格进行垃圾回收。如果obj的范围也在循环的一边。在您只是在集合中插入对象的情况下,方法1更好,因为如果您使用方法2,所有对象在插入objectList后将逐个符合垃圾收集资格,那么obj具有参考在i = 999时将创建的最后一个对象,并且收集器将在循环之后检查obj的引用是否可达,表示它扫描整个。

答案 2 :(得分: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;
}

答案 3 :(得分: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;
}