我的动作课中有以下代码:
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'