2016-07-28 1 views
0

Я работаю со вставкой списка на карту и не могу понять поведение вставки.неопределенность в отношении карты и списка при вставке: java

public class TestList { 

public static void main(String[] args) { 

    String strarray[] = new String[5]; 

    for(int i = 0; i < 5; i++){ 

     strarray[i] = "Demo" + i; 
    } 

    Map<Integer, List<String>> cluesByText = new HashMap<Integer, List<String>>(); 
    int j = 0; 
    for (String str : strarray) { 

     System.out.println(str); 
     List<String> s = cluesByText.get(str); 
     if (s == null) { 
      s = new LinkedList<String>(); 
      cluesByText.put(j, s); 
     } 

     s.add(str); 
     s.add(str); 
     s.add(str); 
     s.remove(1); 
     // why it is storing without doing cluesByText.put(j,s); 
     j++; 
    } 

    //output is: 

    System.out.println(cluesByText); 

} 
} 

Проблема при выполнении вставки списка в карту, а затем при изменении содержимого списка вставки/удаления операции, она становится отражена в списке, который был хранится на карте в предыдущей строке.

окончательный выпуск на принтере карта содержание есть.

{0=[Demo0, Demo0], 1=[Demo1, Demo1], 2=[Demo2, Demo2], 3=[Demo3, Demo3], 4=[Demo4, Demo4]} 

Я не могу понять, почему это происходит таким образом, поскольку состояние списка уже сохранено на карте?

+0

Значение вставленных списков все еще указывает на значение исходных списков. –

+1

Не имеет отношения к вашему вопросу, но ваш код не имеет большого смысла. 'cluesByText.get (str)' всегда будет возвращать значение null, так как ключи вашей Карты являются целыми, а не строками. – Eran

ответ

0

У вас есть ссылка на List<String>, поэтому вы можете добавить в список. Если на карте нет записи, то создается новый List<String>, и запись добавляется на карту. Независимо от этого, объем List<String> позволяет работать.

1

Ожидаемое поведение: вы сохраняете ссылку на список на карте, а не копию. Тот же список упоминается в s, поэтому, если вы добавите его в список через s, это будет видно из карты - это всего лишь две ссылки на один и тот же объект.

1

Помните, что (почти) все в Java является СПРАВОЧНИКОМ, а не значением. Итак, у вас есть карта из целых чисел в «адреса» списков, а не «состояние» списков.

Когда вы идете изучать информацию, хранящуюся в списке, компьютер переходит на этот адрес, чтобы узнать, что там есть.

При назначении s в качестве этого списка он берет этот адрес и сохраняет его в s.

Когда вы вносите изменения в этот список через s.add() или s.remove(), он переходит на тот адрес, который находится на карте, и вносит туда изменения.

Итак, когда вы в конце концов возвращаетесь к этому адресу через карту, вы смотрите на те же самые значения.

Единственный случай, когда этого не происходит, является то, что вы назначаете s оператору =: тогда вы на самом деле переписываете адрес другим, поэтому все, что смотрит на исходный адрес, не изменяется.

Смежные вопросы