Java forloop外部的pojo声明

Java forloop外部的pojo声明,java,performance,garbage-collection,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");

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

我必须在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

    }
public void方法名(){
ArrayList arr=新的ArrayList();

对于(int i=0;i它需要在循环中,否则您只添加了20次相同的用户!

在第二种方法中,列表中只有最后一个对象,这两种方法都会产生不同的结果

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

然而,第二个具有相同的对象。因此,其中一个对象上的更改将反映其他对象。实际上,最后,所有对象的属性将是相同的,即等于上次添加的对象

就性能而言,您不能这么说。只有当没有指向对象的引用时,对象才有资格进行垃圾收集。但是,由于这两种方法都执行不同的功能,您无法对它们进行比较


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

第一种方法和第二种方法之间的主要区别是,在第一种情况下,你在内存中创建了20个不同的
用户
,分配给数组

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

无论第一种方案还是第二种方案,您创建的
用户
实例只有在阵列本身符合垃圾收集条件时才符合垃圾收集条件,除非您删除与阵列的关联


只有当没有其他实例引用某个实例时,才会对该实例进行垃圾收集。

我认为正确的方法是: -对外申报 -内部实例化

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

}
public void方法名(){
ArrayList arr=新的ArrayList();
用户userobj;
对于(int i=0;i
我想知道第二种方法是否有显著的性能改进

你经历过不同吗

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

甚至不要考虑性能,除非您有实际的性能问题,并且您已经通过分析证明了某个构造是原因

终极通用性能提示是:

做某事最快的方法就是不去做


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

“一位朋友建议”这不是你的朋友,因为她强迫你输入错误的代码。虽然这是绝对正确的,但它无法直接回答问题。你无法解释这两种方式之间的区别,以及它们之间的关系。
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

}