我已将一个数组列表附加到servlet
的会话中,并且在附加后,我正在清除arraylist
中的servlet
,因此它也会从会话中清除。
你能说出理由吗?
答案 0 :(得分:1)
即使你的问题不是Stack Overflow的问题,我想我的意思是你的意思。
所以你有一个
List<MyClass> myList = new ArrayList<MyClass>();
你的代码中的,你
.clear()
。右?
问题是,与您的想法相反,您只有一个 ArrayList
个实例。它是“在”会话中并且“在您的servlet中”是相同的。只有你有一个不同的引用指向它...
您需要做的是将列表实例的不同实例附加到您的会话中:
//this creates a new list instance, with references to the same objects
List<MyClass> myNewList = new ArrayList<MyClass>(myList);
并将此myNewList
“附加”到会话中。这样,生成的两个列表可以以不同方式处理,它们可以具有不同的内容。如果改变一个,另一个将保持不变。
我建议重新考虑你的结构,共享信息始终是一个需要仔细处理的问题,Java Concurrency In Practice是处理这类问题时要阅读的重要书籍。
答案 1 :(得分:0)
显然,会话中也会清楚,因为您在会话中添加了对数组集合的引用。因此,数组列表对象,会话中的对象和代码中的对象(列表已添加到会话之后)都指向内存中的同一对象。因此,如果清除ArrayList对象,则会话中包含的也引用同一对象的基础对象将变得清晰。
要使代码正常工作,您可以做一件事。创建ArrayList的克隆并将该列表放入会话中。然后做你想做的任何事情。它不会影响驻留在会话中的对象。
希望这有帮助。
答案 2 :(得分:0)
显然,在会话中设置ArrayList后,您继续使用arraylist并进行编辑。
但是你应该知道,你在会话中设置的内容只是对实际arraylist的内存引用。 您所做的任何更改仍会影响,因为两个变量都指向内存中的相同列表。
为了避免你可以
1)在会话中设置数组列表后,将null赋给变量,这样就不会在不知不觉中继续使用它
ArrayList list = new ArrayList ();
session.setAttribute("list",list);
list = null ; // Assigning the variable to null