我已经将一个数组列表附加到会话中,servlet
并且在附加之后,我正在清除它arraylist
,servlet
所以它也从会话中变得清晰。
请问可以给个理由吗??
即使您的问题对于 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是处理此类问题时要阅读的关键书籍。
显然,从会话中也可以清楚地看到,因为您在会话中添加了对数组集合的引用。因此,数组列表对象,会话中的对象和代码中的对象(在将列表添加到会话之后)都指的是内存中的同一个对象。因此,如果您清除 ArrayList 对象,那么会话中包含的也引用同一对象的基础对象将变得清晰。
为了使您的代码正常工作,您可以做一件事。创建 ArrayList 的克隆并将该列表放入会话中。然后对你的对象做任何你想做的事情。它不会影响驻留在会话中的对象。
希望这可以帮助。
显然,在 session 中设置 ArrayList 后,您将继续使用 ArrayList 并对其进行编辑。
但是您应该知道,您在会话中设置的只是对实际数组列表的内存引用。您所做的任何更改仍然会影响,因为两个变量都指向内存中的同一个列表。
为了避免你可以
1)在 session 中设置好数组列表后,给变量赋值为 null,以免在不知不觉中继续使用
ArrayList list = new ArrayList ();
session.setAttribute("list",list);
list = null ; // Assigning the variable to null