在for循环内部实例化一个java对象

时间:2014-10-14 20:44:02

标签: java

这样做有什么区别?

Test test = new Test();
for(Person person:personLst) {
    test.setName(person.getName());
    test.setId(person.getId());
}

通过这个 -

 for(Person person:personLst) {
    Test test = new Test();
    test.setName(person.getName());
    test.setId(person.getId());
}

这两种情况都会覆盖数据吗?

4 个答案:

答案 0 :(得分:1)

对于对象数据覆盖,您将获得与相同的结果,但创建测试对象的开销与personLst中的人员一样多。即将到来的开销带来了一个优点,即在循环中保持person对象状态的变量。相反,在第一种情况下,您只能访问最新的人物对象数据。

换句话说,在第一种情况下,在内存中为对象测试保留了一些空间(即字段名和id):

Case 1:
Address    Memory Space
[test]---> [name]
           [id] 

            ...

[test]---> [nameN]
           [idN] 

但是在第二种情况下,你总是在你的记忆中的不同位置创建新的对象(当特定的循环步骤结束时,先前的创建就会消失 - 这意味着在某些时候释放了内存):

Case 2:
Address    Memory Space
[test]---> [name]
           [id] 

            ...

[testN]--->[nameN]
           [idN] 

[test] ... [testN]表示代表Test对象的内存区域的地址(简化模型)。

感谢输入https://stackoverflow.com/users/1580864/mark-w

答案 1 :(得分:1)

这很难回答,因为我们不知道

  • 如果有setName / setId
  • 的任何副作用
  • 您将如何处理测试对象。<​​/ li>

从我们的代码中可以看出,第二个循环只是一个无操作,第一个循环可以替换为仅使用列表中的最后一项进行更新,而忽略其他条目。

答案 2 :(得分:0)

第一个: test对象属性将具有列表中最后一个人的属性

第二个: 您可以将任何Test对象创建为只能在for循环中访问的Person obejct

答案 3 :(得分:0)

这取决于你想要达到的目标。

案例1:您只创建“Test”类的一个实例并在循环中更改其值。如果任何其他方法需要测试作为输入,这很好。您正在将Person对象转换为Test对象并将其传递。

案例2:在这里创建多个Test实例(等于personLst中的项目数)。如果要将所有Person对象转换为Test对象并存储在列表(或任何集合)中以供将来使用,那么这是正确的。