2012-04-06 2 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' только обеспечивает модификации самой карты (помещает, удаляет и т. Д.), Не гасит с изменениями в других потоках. – oconnor0

0

Да, вы можете. Карта просто содержит ссылку на объект. Объект может измениться без обновления карты.

Map<Integer, MyObj> myMap = new ConcurrentMap<Integer, MyObj>(); 
myMap.put(1, new MyObj()); 
MyObj obj = myMap.get(1); 
obj.setFoo("Foo"); 
Смежные вопросы