2013-02-25 15 views
0

我已將一個數組列表從servlet附加到會話中,並且在附加後,我正在清除servlet中的那個arraylist,因此它也從會話中清除。ArraryList在會話中的附件

您能否給出原因?

+3

顯示你的代碼。 .. – Sathish 2013-02-25 12:33:52

+0

您可能正在使用同一個列表對象。 – igr 2013-02-25 12:35:18

回答

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是處理這類問題時要讀的關鍵一本書。

+0

許多非常感謝。我知道了 :) – user2069692 2013-03-18 07:20:41

0

很明顯,它會從會話中清除,因爲您正在會話中添加對數組集合的引用。因此,數組列表對象(在會話中的列表對象和代碼中的列表對象(在列表添加到會話之後)引用內存中的同一對象。因此,如果清除ArrayList對象,則會話中包含的也指向同一對象的基礎對象將變得清晰。

爲了讓您的代碼正常工作,您可以做一件事。創建ArrayList的克隆並將該列表放入會話中。然後做任何你想做的事情與你的對象。它不會影響駐留在會話中的對象。

希望這會有所幫助。

0

很顯然,在會話中設置ArrayList後,您繼續使用數組列表並編輯它。

但你應該知道,你在會話中設置的內容只是實際數組列表的內存引用。 您所做的任何更改仍會影響,因爲這兩個變量都指向內存中的相同列表。

爲避免你可以

1)在設置會話中數組列表,指定一個空變量,這樣你就不會在不知不覺中繼續使用它

ArrayList list = new ArrayList(); 

session.setAttribute("list",list); 

list = null ; // Assigning the variable to null