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

Difference between copying a list to another with or without 'new' - JAVA

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 中是否有更易读的方法?

您可以以可读的方式在单个语句中完成:

   secondList.addAll(sessionBean.firstList())

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

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());

或者,如果您在 MyObject class

中实现 clone 方法
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())