我的动作课中有以下代码:

MemberData mbr = MyUtil.getMember(request.getSession());
:::::::::::::::::::::::
{
 List sysList = mbr .getSystemList();   //returns 'systemList'
 sysList.addAll(mbr .getUserEnteredList());  //add user entered to the system entered objects list
 addWorksheetFor(wb, sysList);  //add the list to an excel workbook
}


我在会话中有MemberData,它包含一个名为systemList的列表。当我使用List sysList = mbr.getSystemList()然后添加用户输入的列表时,会话对象中的“ systemList”将被修改。我将两个列表添加到本地变量“ sysList”中,但会话变量“ systemList”也已修改。它与“ sysList”相同。

但是,当我分别遍历systemList和userEnteredList并添加到第三个列表时,如下所示:

MemberData mbr = MyUtil.getMember(request.getSession());
:::::::::::::::::::::::
{
 List sysList = mbr .getSystemList();   //returns 'systemList'
 List userList = mbr .getUserEnteredList();  //returns 'userEnteredList'
 List allList = new ArrayList();
 for (Iterator it=sysList.iterator(); it.hasNext();)
 allList.add(it.next());
 for (Iterator it=userList.iterator(); it.hasNext();
 allList.add(it.next());
 addWorksheetFor(wb, sysList);  //add the list to an excel workbook
}


然后就可以了。在这种情况下,会话变量不会被修改。
有任何想法吗?

最佳答案

当您获得期望的引用时,Java不会返回值(实例)的副本。它返回完全相同的值(实例)。这就是所谓的“按值传递”,对于具有过程编程语言背景(例如PHP)的程序员而言,确实的确令人困惑。

最好的选择就是创建一个新值(实例)。但是,您尝试的方法有点笨拙,可以简化如下:

List sysList = mbr.getSystemList();   // returns 'systemList'
List userList = mbr.getUserEnteredList();  // returns 'userEnteredList'
List allList = new ArrayList(sysList); // creates a copy of 'sysList'
allList.addAll(userList); // adds 'userList' to copy of 'sysList'

10-01 05:01