2012-04-06 53 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"); 
相關問題