2012-04-06 6 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

4

「変更」の定義によります。内部の何かをMyObjに変更したいのであれば、そのオブジェクトが変更可能であることは確かです。

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

あなたは完全に新しいインスタンスを持つオブジェクトを交換したい場合は、ちょうどそのような値が存在する場合は、既存のマップされた値が上書きされますされ、Map#put()を呼び出すことができます。

+1

「MyObj」への参照がある場合、その状態を変更することはできません。 'ConcurrentMap'は、マップ自体(puts、deletesなど)の変更が他のスレッドの変更に悩まされないようにします。 – oconnor0

0

はいできます。マップは単にオブジェクトへの参照を保持します。マップを更新することなくオブジェクトを変更できます。

Map<Integer, MyObj> myMap = new ConcurrentMap<Integer, MyObj>(); 
myMap.put(1, new MyObj()); 
MyObj obj = myMap.get(1); 
obj.setFoo("Foo"); 
関連する問題