使用或不使用“new”将列表复制到另一个列表之间的区别 - JAVA

时间:2018-02-25 23:05:32

标签: java list copy clone

1)

之间有什么区别
for (MyObject myObject : sessionBean.firstList()) {
    secondList.add(new MyObject(myObject.getSeverity(), myObject.getSummary(), myObject.getDetail()));
}

for (MyObject myObject : sessionBean.firstList()) {
    secondList.add(facesMessage);
}

考虑到我后来想要清除sessionBean.firstList但想要保留secondList中的值。

2)在java 8中有更可读的方法吗?

2 个答案:

答案 0 :(得分:1)

你可以用一种可读的方式在单一陈述中完成:

   secondList.addAll(sessionBean.firstList())

使用new时,您将分配额外的内存,否则您将映射现有对象的引用。即使您想在稍后的时间点清除sessionBean.firstList,如果您对另一个集合中的对象有有效的引用,垃圾收集器也不会收集它。所以我看不出任何有效的场景来强制使用new运算符。

答案 1 :(得分:0)

1)不同之处在于,在第一种情况下,secondList将包含对具有与firstList中相同字段的新对象的引用。在第二种情况下,secondList将包含与firstList相同对象的引用。因此,如果您修改了firstList项之一,则secondList中的相应项也会被修改。

2)您可以使用以下示例创建包含副本的列表:

List<MyObject> secondList = sessionBean.firstList()
    .stream()
    .map(first -> new MyObject(first.getSeverity(), first.getSummary(), first.getDetail()))
    .collect(Collectors.toList());

或者,如果您在clone

中实施MyObject方法
public MyObject clone() {
    return new MyObject(severity, summary, detail);
}

你可以简单地写一下:

List<MyObject> secondList = sessionBean.firstList()
     .stream()
     .map(MyObject::clone)
     .collect(Collectors.toList());

或者,如果您只想复制参考文献,请使用

secondList.addAll(sessionBean.firstList())