2013-03-01 34 views
1

如果我在會話中放置地圖。然後,如果我從地圖中刪除一個對象。這是否也會改變會話中的地圖,還是必須再次將地圖放入會話中?會話如何在java中工作?

  Map map = new HashMap(); 

     map.put("1", "1"); 
     map.put("2", "2"); 
     map.put("3", "3"); 
     map.put("4", "4"); 

     Session session = getSession(); 

     session.setAttribute("myMap", map); 

     map.remove("1"); 
+1

是的,它也會更新會話中的地圖。 – 2013-03-01 03:55:16

回答

1

會議一直到你把。 如果更改地圖的內容對象的引用,地圖對象引用不會改變。它仍然是相同的地圖,所以你在會話中的信息也會改變。

像這樣:

Map original_map = new HashMap(); 
session.setAttribute("myMap", original_map); 

// Now put something into original_map... 
// The _content_ of the map changes 

// Later: 
Map retrieved_map = session.getAttribute("myMap"); 

// you'll find that retreived_map == original_map. 
// They're the same object, the same Map reference. 
// So the retrieved_map contains all that you put into the original_map. 
+0

它是相同的地圖,但地圖的內容發生變化。 – Kay 2013-03-01 03:59:03

+0

是的,因爲它們是相同的地圖。像這樣:'Map map2 = map1; map2.put(...);' - >現在map1也包含新元素,因爲它們是相同的地圖。地圖變化的內容,但它是相同的地圖。 – Kay 2013-03-01 04:01:06

+0

我雖然很清楚。添加了爲什麼對象引用相同的示例:相同的地圖,所以更改一個也會更改另一個地圖,因爲它們是相同的地圖。不要將引用與Object的內容混淆。 – Kay 2013-03-01 04:12:16

0

你的地圖仍然在會話中。但是,在這種情況下使用WeakHashMap可能更好。請參閱以下鏈接

Weak Hash Map Discussion

+0

這與這個確切的問題有什麼關係? – 2013-03-01 04:02:48

+0

弱哈希圖可能實際上不起作用。想象一下這個場景:Servlet 1通過一個弱哈希映射把某些東西放入會話中。 Servlet 1完成後,對象被垃圾收集。之後,Servlet 2嘗試從會話中檢索地圖 - >地圖中的對象引用,因爲它們很弱,已經消失。如果您想實際保留會話中的信息,具有普通引用的普通Map將保留數據,直到會話關閉。 – Kay 2013-03-01 04:06:11

+0

@LuiggiMendoza,他問的是如何在地圖/會話中移除和放置對象。我認爲這對他了解這個Map實現可能是有用的。凱你是對的,它可能不適合所有情況,但在其他情況下,你的會話可能會阻止某些對象在應該被擦除時被垃圾收集。關於WeakHashMap的評論只是一個建議,與當前問題無關。 – psabbate 2013-03-01 04:14:35

3

會話是的,它會更新地圖......

Map map = new HashMap(); 
     map.put("1", "1"); 
     map.put("2", "2"); 
     map.put("3", "3"); 
     map.put("4", "4"); 
     session.setAttribute("myMap", map); 

     map.remove("1"); 
     Object mapw = session.getAttribute("myMap"); 
     out.println(mapw); 

輸出

{3=3, 2=2, 4=4} 
0

是的,它會更新。

其原因是Java中的所有對象都是通過引用傳遞的,除非訪問器返回對象的副本。