我的应用程序中有一个场景,
我必须在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将有资格获得垃圾收集器..
我想知道第二种方法是否有任何重要的表现会改善?
答案 0 :(得分:1)
唉,你的朋友错了。第一种方式是你正在寻找的。 p>在第一个中,您创建 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
}