2013-10-15 2 views
1

У меня есть структура данных Map<Long,List<POJO>>. Мне нужно перебирать карту и для каждого списка, мне нужно добавить элементы в список. Так, например, если в списке было 10 элементов, это может закончиться 12. Мой вопрос: будет ли причиной исключения параллельной модификации, если я возьму простой подход к итерации карты и изменю каждый List<POJO>? Поскольку я не буду явным образом изменять адрес каждого Списка. Я предполагаю, что вопрос является вопросом, будет ли Список изменять свой адрес, если ему нужен более крупный непрерывный блок для хранения своего массива.избежать исключения одновременной модификации с помощью карты <Long, List <POJO>>

+0

Я работаю над большой проблемой, и я об этом думаю. Я просто надеялся, что эксперт может помочь мне быстро ответить на этот вопрос. –

+0

Вы получили исключение, пока вы его пробовали? Или вы попробовали? – UDPLover

ответ

3

Ответ на оба ваши вопросы «нет»:

  • Там не будет ConcurrentModificationException, если все, что вы делаете, мутирует значения карты, так как вы на самом деле не изменения сами ценности, просто изменяя их состояние. Это достаточно легко проверить и подтвердить.

  • Список не будет «изменять свой адрес», если вы попытаетесь добавить больше элементов, чем может удерживать. Вместо этого больше места будет выделено внутри страны. Например, для ArrayList внутренний массив будет заменен новым большим массивом, и элементы будут скопированы.

+0

Ваш второй пункт, похоже, не согласен с @Batty. И я склонен принять ваш ответ, поскольку он неожиданно кажется более разумным. +1. Спасибо за ответ. –

2

Если вы пытаетесь изменить/добавить к карте во время итерации по ней, произойдет Exception, но в вашем случае вы выполняете итерацию по карте, но добавляете ее во внутреннюю карту списка, поэтому проблем не будет. о втором вопросе, адрес никогда не изменяется, но зависит от реализации, скажем, если это ArrayList, а на добавочном пространстве недоступно в одном месте, тогда создается новый List и элементы копируются, но это не всегда так.

+0

Хорошая точка +1. Благодарю. Вы знаете, как это влияет на более широкий вопрос? –

+1

Это неверно. Адрес списка не изменяется. – arshajii

+0

говорят, что ArrayList с начальным размером говорит 5, как только список заполнен, и появляется 6-й элемент, JVM делает размер List равным 10, а если размер = 10 недоступен в одном месте, то создается новый список и элементы копируются, это это всегда не так. – Batty

0

Этот список изменит размер и расположение памяти, если это необходимо. ArrayLists создаются с их начальной мощностью, а затем удваиваются после достижения предела. Если нет последовательной памяти, адрес будет изменен на другой непрерывный блок для хранения списка. Однако связанный список не выделяется таким образом. Связанный список выделяет пространство для узла, а следующие ссылки поддерживаются и сохраняются как атрибут объекта, поэтому непрерывная память не нужна.

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