在我的申请中有一个场景,
我必须在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
}其中一位朋友建议在for循环外部更改UserObj声明。
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将有资格使用垃圾收集器。
我想知道,第二种方法是否有显著的改善?
发布于 2017-05-15 15:32:09
我想知道,第二种方法是否有显著的改善?
你经历过什么不同吗?
在编程时,您应该关注代码的正确性和可读性。
甚至不要考虑性能,除非您有实际的性能问题,并且您已经通过分析证明了特定的构造是造成性能问题的原因。
最终的通用性能提示是:
做某事最快的方法就是不去做。
因此,重点关注避免不必要/隐藏循环的好算法,而不是可能提高性能的语法变体。
发布于 2017-05-15 15:21:42
这两种方式,都会产生不同的结果。
在第一个中,创建20个单独的对象,并将它们添加到列表中。因此,对其中一个进行更改,不会影响其他。 然而,第二个,,具有相同的对象。因此,其中一个上的更改将反映另一个。实际上,在最后,所有对象的属性都是相同的,即等于上次添加的对象 就性能而言,你不能说。只有当没有指向它们的引用()时,对象才有资格进行垃圾收集。但是,由于这两种方法都执行不同的功能,所以不能对它们进行比较。
唉,你的朋友错了。第一条路是你要找的东西。
发布于 2017-05-15 15:23:15
第一种方法和第二种方法的主要区别是,在第一种情况下,您在内存中创建了20个不同的User,它们被分配给数组。
在第二种情况下,您只在内存中创建一个User,但是将其属性更改20次,并将相同的User分配给数组的所有20个位置。
不管是第一种还是第二种情况,创建的User实例只有在数组本身符合垃圾收集条件时才有资格进行垃圾收集,希望您删除与该数组的关联。
只有在没有其他实例引用的情况下,才会对实例进行垃圾收集。
https://stackoverflow.com/questions/43983107
复制相似问题