Java 会话中的ArrayList附件

Java 会话中的ArrayList附件,java,session,servlets,Java,Session,Servlets,我已经从servlet将一个数组列表附加到会话中,附加之后,我正在servlet中清除该arraylist,因此它也从会话中变得清晰 你能给出原因吗???即使你的问题不是很适合堆栈溢出,我想我明白你的意思了 所以你有一个 List<MyClass> myList = new ArrayList<MyClass>(); 并将此myNewList附加到会话。通过这种方式,生成的两个列表可以进行不同的处理,它们可以具有不同的内容。如果你改变一个,另一个将保持不变 但是,我建议

我已经从
servlet
将一个数组列表附加到会话中,附加之后,我正在
servlet
中清除该
arraylist
,因此它也从会话中变得清晰


你能给出原因吗???

即使你的问题不是很适合堆栈溢出,我想我明白你的意思了

所以你有一个

List<MyClass> myList = new ArrayList<MyClass>();
并将此
myNewList
附加到会话。通过这种方式,生成的两个列表可以进行不同的处理,它们可以具有不同的内容。如果你改变一个,另一个将保持不变


但是,我建议您重新思考您的结构,共享信息始终是一个需要仔细处理的问题,是处理此类问题时需要阅读的一本关键书。

显然,从会话中可以清楚地看到,这也是因为您在会话中添加了对数组集合的引用。因此,会话中的数组列表对象和代码中的数组列表对象(将列表添加到会话后)都引用内存中的同一对象。因此,如果清除ArrayList对象,则会话中包含的也引用同一对象的底层对象将被清除

要使代码正常工作,您可以做一件事。创建ArrayList的克隆并将该列表放入会话中。然后对你的目标做任何你想做的事。它不会影响驻留在会话中的对象


希望这有帮助。

显然,在会话中设置ArrayList后,您将继续使用ArrayList并对其进行编辑

但是您应该知道,您在会话中设置的只是对实际arraylist的内存引用。 您所做的任何更改仍然会影响,因为这两个变量都指向内存中的同一个列表

为了避免,你可以

1) 在会话中设置数组列表后,为变量指定一个null,这样您就不会在不知不觉中继续使用它

ArrayList list = new ArrayList ();

session.setAttribute("list",list);

list = null ; // Assigning the variable to null

您可能正在使用同一个列表对象。非常感谢。我明白了:)
ArrayList list = new ArrayList ();

session.setAttribute("list",list);

list = null ; // Assigning the variable to null