在forloop之外的pojo声明

时间:2017-05-15 15:18:31

标签: java performance garbage-collection

我的应用程序中有一个场景,

我必须在ArrayList中添加20个POJO对象。在这种情况下,我有一个像下面这样的方法。

 public void methodname() {

ArrayList arr = new ArrayList();    
    for(int i=0;i<20;i++) {
     User userobj = new User();
     userobj.setName("xxx");
     userobj.setFirstName("xxx");
     userobj.setLastName("yyy");
arr.add(userobj);
    } // end of for loop

    }

其中一位朋友建议将UserObj声明更改为for循环。

  public void methodname() {
    User userobj = new User();
ArrayList arr = new ArrayList();    
    for(int i=0;i<20;i++) {
     userobj.setName("xxx");
     userobj.setFirstName("xxx");
     userobj.setLastName("yyy");
arr.add(userobj);
    } // end of for loop

    } 

在第一种方法中,我在for循环中创建了userobj,所以当下一次迭代到来之前,userobj将有资格获得垃圾收集器..

我想知道第二种方法是否有任何重要的表现会改善?

6 个答案:

答案 0 :(得分:1)

两种方式,都会产生不同的结果。

  

在第一个中,您创建 20个单独的对象,并将它们添加到列表中。因此,对其中一个进行更改,不会影响其他人

     

第二,具有相同的对象。因此,的变化将反映其他人。实际上,最后,所有对象的属性都是相同的,即等于最后添加的对象

     

在性能方面,你不能说。当没有指向它们的引用时,对象才有资格进行垃圾回收。但是,由于两种方式都执行单独的功能,因此您无法对它们进行比较。

唉,你的朋友错了。第一种方式是你正在寻找的。

答案 1 :(得分:1)

第一种方法和第二种方法的主要区别在于,在第一种情况下,您在内存中创建了20个不同的User,这些User被分配给数组。

在第二种情况下,您只在内存中创建一个User,但更改其属性20次,并将相同的User分配给数组的所有20个位置。

无论第一个场景或第二个场景如何,只有当阵列本身符合垃圾收集条件时,您创建的UTC_USEC_TO_TIMESTAMP()个实例才有资格进行垃圾收集,期望您删除与阵列的关联。

如果没有其他实例引用它,则仅对实例进行垃圾收集。

答案 2 :(得分:1)

  

我想知道第二种方法是否有任何重要的表现会改善?

体验有区别吗?

编程时,您应该关注代码的正确性可读性

除非您遇到实际的性能问题并且通过分析证明某个构造是原因,否则不要考虑性能。

最终的通用性能提示是:

  

做某事的最快方法就是不这样做。

因此,请专注于避免不必要/隐藏循环的优秀算法,而不是可能提高性能的语法变体。

答案 3 :(得分:0)

它需要在循环内部,否则你只需要添加SAME用户20次!

答案 4 :(得分:0)

在第二种方法中,列表中只有一个最后一个对象

答案 5 :(得分:0)

我认为正确的方法是:   - 外面的声明   - 实例化

public void methodname() {
  ArrayList arr = new ArrayList();
  User userobj; 
  for(int i=0;i<20;i++) {
     userobj = new User();
     userobj.setName("xxx");
     userobj.setFirstName("xxx");
     userobj.setLastName("yyy");
     arr.add(userobj);
  } // end of for loop

}