2012-04-06 64 views

回答

3

不仅如此,但如果您保留对该对象的原始引用,仍然可以对其进行修改。

MyObject o = new MyObject(); 
myMap.put("key", o); 

o.setName("foo"); 
myMap.get("key").getName(); //will return "foo" 
myMap.get("key").setName("bar"); 
myMap.get("key").getName(); //will return "bar" 

o = null; //this applies only for your local reference, not for the map 
myMap.get("key").getName(); //will STILL return "bar" 
+0

这很好,我不知道它。谢谢。 – marxin 2012-04-06 18:08:47

4

这取决于您对“修改”的定义。如果你想改变MyObj内部的东西,并且该对象是可变的,你当然可以做到这一点。

ConcurrentMap<Integer, MyObj> map = /* snip */; 
map.get(someKey).callMutatorMethod(); 

如果你想更换一个全新的实例的对象,你可以叫Map#put(),这将覆盖现有的映射的值,如果该值存在。

+1

如果你有'MyObj'的引用,没有什么能阻止你改变它的状态。 'ConcurrentMap'只能确保对映射本身的修改(放置,删除等)不会在其他线程中进行修改。 – oconnor0 2012-04-06 17:49:10

0

是的,你可以。该地图只保存对该对象的引用。该对象可以更改而不必更新地图。

Map<Integer, MyObj> myMap = new ConcurrentMap<Integer, MyObj>(); 
myMap.put(1, new MyObj()); 
MyObj obj = myMap.get(1); 
obj.setFoo("Foo"); 
相关问题