2013-03-01 54 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中的所有对象都是通过引用传递的,除非访问器返回对象的副本。