2015-09-13 3 views
-1

У меня есть один список. Я заселяю его, а затем кладу на карту. Затем я очищаю список, снова заполняю его и помещаю на ту же карту под другим ключом. Ans и так далее в цикле.Переместить ссылку на изображение, чтобы скопировать код

Map<String, List<MyClass>> map = new HashMap<>(); 
List<MyClass> list = new ArrayList<>(); 
list.add(new MyClass(id_1)); 
map.put("key_1", list); 
list.clear(); 
list.add(new MyClass(id_2)); 
map.put("key_2", list); 
//map is = {key_1:id_2, key_2:id_2} 
//Why map is NOT = {key_1:id_1, key_2:id_2} 

Почему кажется, что карта получает ссылку на список вместо новой копии списка?

+1

У вас есть один список. Как и вы сказали. –

ответ

1

Вы добавили одну и ту же ссылку к списку на карту: «key_1» и «key_2» обе указывают на тот же объект List. Что вам нужно сделать, так это создать второй список, основанный на первом:

Map<String, List<MyClass>> map = new HashMap<>(); 
List<MyClass> list = new ArrayList<>(); 
list.add(new MyClass(id_1)); 
map.put("key_1", list); 
list.clear(); 
list.add(new MyClass(id_2)); 
map.put("key_2", new ArrayList<>(list)); 
1

Именно так работает Java. Каким образом размещение на карте является ссылкой на список. Если вы хотите скопировать список, вам нужно сделать это явно.

List<MyClass> copy = new ArrayList<>(list); 
1

Когда вы делаете map.put («key_2», list), вы помещаете ссылку на объект списка. Вам нужно создать экземпляр другого объекта списка.