会话中的ArrayList附件

时间:2013-02-25 12:29:59

标签: java session servlets

我已将一个数组列表附加到servlet的会话中,并且在附加后,我正在清除arraylist中的servlet,因此它也会从会话中清除。

你能说出理由吗?

3 个答案:

答案 0 :(得分:1)

即使你的问题不是Stack Overflow的问题,我想我的意思是你的意思。

所以你有一个

List<MyClass> myList = new ArrayList<MyClass>();
你的代码中的

,你

  1. 将其放入会话
  2. 以及其他地方你可以.clear()
  3. 右?

    问题是,与您的想法相反,您只有一个 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