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

使用或不使用'将列表复制到另一个列表之间的区别;新';-JAVA,java,list,copy,clone,Java,List,Copy,Clone,1) 两者的区别是什么 for (MyObject myObject : sessionBean.firstList()) { secondList.add(new MyObject(myObject.getSeverity(), myObject.getSummary(), myObject.getDetail())); } 及 考虑到我以后想清除sessionBean.firstList,但想保留secondList中的值 2) 在java 8中是否有一种更可读的方式来执行此操作?

1) 两者的区别是什么

for (MyObject myObject : sessionBean.firstList()) {
    secondList.add(new MyObject(myObject.getSeverity(), myObject.getSummary(), myObject.getDetail()));
}

考虑到我以后想清除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());
你可以简单地写:

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

这是如何回答这个问题的?@Stephen这是否意味着第二个是深度副本?@overflow是的,它是深度副本。但就您的目的而言,即使是第一个对象也足够了。如果您修改了
第二个列表中的一个或多个对象,会发生什么情况?这基本上回答了这个问题
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())