0

我已经将一个数组列表附加到会话中,servlet并且在附加之后,我正在清除它arraylistservlet所以它也从会话中变得清晰。

请问可以给个理由吗??

4

3 回答 3

1

即使您的问题对于 Stack Overflow 来说不是很好,但我想我明白了您的意思。

所以你有一个

List<MyClass> myList = new ArrayList<MyClass>();

在你的代码某处,你

  1. 把它放在会话中
  2. 并在其他地方进行操作.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是处理此类问题时要阅读的关键书籍。

于 2013-02-25T12:35:11.623 回答
0

显然,从会话中也可以清楚地看到,因为您在会话中添加了对数组集合的引用。因此,数组列表对象,会话中的对象和代码中的对象(在将列表添加到会话之后)都指的是内存中的同一个对象。因此,如果您清除 ArrayList 对象,那么会话中包含的也引用同一对象的基础对象将变得清晰。

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

希望这可以帮助。

于 2013-02-25T12:36:43.737 回答
0

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

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

为了避免你可以

1)在 session 中设置好数组列表后,给变量赋值为 null,以免在不知不觉中继续使用

ArrayList list = new ArrayList ();

session.setAttribute("list",list);

list = null ; // Assigning the variable to null
于 2013-02-26T04:01:57.437 回答