Какие основные операции на Карте разрешены при итерации по нему?

В зависимости от размера вашего проекта, существует множество пакетов, которые легко справляются с отправкой формы, например: formik, redux-form, react-final-form, если не считать нескольких. Но большинство из них используют ту же технику. Например, formik правильно делает это, а также обрабатывает некоторые крайние случаи для вас, чтобы вам не пришлось беспокоиться.

Вкратце, я бы сказал, да, это лучший способ или, по крайней мере, способ реагирования, для обработки данных формы.

11
задан Chris Markle 29 January 2009 в 05:16
поделиться

4 ответа

Можно использовать Iterator.remove(), и при использовании entrySet итератора (Карты. Запись), можно использовать Map.Entry.setValue(). Что-либо еще и все ставки прочь - Вы не должны изменять карту непосредственно, и некоторые карты не разрешат или или оба из вышеупомянутых методов.

А именно, Ваш (1), (2) и (3) не разрешены.

Вам могло бы сойти с рук устанавливание значения существующего ключа через Map объект, но Set.iterator() документация конкретно устраняет это, и это будет конкретная реализация:

Если карта изменяется, в то время как повторение по набору происходит (кроме через собственный итератор, удаляют операцию, или посредством setValue операции на записи карты, возвращенной итератором), результаты повторения не определены. (добавленный акцент)

13
ответ дан 3 December 2019 в 07:14
поделиться

Если Вы будете смотреть на класс HashMap, то Вы будете видеть поле, названное 'modCount'. Это - то, как карта знает, когда она была изменена во время повторения. Любой метод, который увеличивает modCount, когда Вы выполняете итерации, заставит это бросать ConcurrentModificationException.

Тем не менее Вы, CAN поместил значение в карту, если ключ уже существует, эффективно обновляя запись с новым значением:

 Map<String, Object> test = new HashMap<String, Object>();
 test.put("test", 1);

 for(String key : test.keySet())
 {
     test.put(key, 2); // this works!
 }

 System.out.println(test); // will print "test->2"

Когда Вы спрашиваете, можно ли выполнить эти операции 'безопасно', Вы не должны волноваться слишком много, потому что HashMap разработан для броска того ConcurrentModificationException, как только он сталкивается с проблемой как это. Эти операции перестанут работать быстро; они не оставят карту в плохом состоянии.

2
ответ дан 3 December 2019 в 07:14
поделиться

В целом, если Вы хотите изменить Карту при итерации по нему, необходимо использовать один из методов итератора. Я на самом деле не протестировал, чтобы видеть, будет ли желание № 1 работать, но другие определенно не будут.

0
ответ дан 3 December 2019 в 07:14
поделиться

Нет никакого глобального ответа. Интерфейс карты позволил выбору пользователям. К сожалению, я думаю, что все реализации в jdk используют внедрение FAST сбоя (вот определение сбоя быстро, как это указало в HashMap Javadoc):

Итераторы, возвращенные всеми "методами просмотра набора этого класса", являются сбоем быстро: если карта структурно изменяется когда-либо после того, как итератор создается, всегда кроме через собственный итератор удаляют метод, итератор бросит ConcurrentModificationException. Таким образом, перед лицом параллельной модификации, итератор перестал работать быстро и чисто, вместо того, чтобы рискнуть произвольным, недетерминированным поведением в неопределенное время в будущем.

2
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: