java.util.ConcurrentModificationException в списке [duplicate]

Я думаю, что varchar (20) требует только 21 байт, а varchar (500) требует только 501 байт. Таким образом, суммарные байты 522, меньше 767. Итак, почему я получил сообщение об ошибке?

UTF8 требует 3 байта на символ для хранения строки, поэтому в вашем случае 20 + 500 символов = 20 * 3 + 500 * 3 = 1560 байт, что более чем допустимо 767 байт.

Предел для UTF8 равен 767/3 = 255 символов, для UTF8mb4, который использует 4 байта на символ, это 767 / 4 = 191 символ.


. Если вам нужно использовать более длинный столбец, чем предел, это два решения:

  1. Используйте «более дешевую» кодировку ( один, который требует меньше байтов на символ). В моем случае мне нужно было добавить уникальный индекс в столбец, содержащий строку SEO-статьи, поскольку я использую только символы [A-z0-9 \ -] для SEO, Я использовал latin1_general_ci , который использует только один байт на символ, поэтому столбец может иметь длину 767 байт.
  2. Создайте хэш из своего столбца и используйте уникальный индекс только для этого. Другим вариантом для меня было создание другого столбца, в котором будет храниться хэш SEO, этот столбец имел бы UNIQUE ключ для убедитесь, что значения SEO уникальны. Я бы также добавил индекс KEY в исходную колонку SEO, чтобы ускорить поиск.
6
задан 30 October 2012 в 08:20
поделиться

2 ответа

Acc. to Java Docs :

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

Вы пытаетесь добавить объект Person во время повтора с помощью Enhanced For loop .

Вы можете выполнить следующую модификацию:

boolean duplicateFound = false;
for(Person p : ps)
{
    if(p.name.equals(p1.name))
    {
        duplicates.add(p1);
        duplicateFound = true;
    }
}

if( ! duplicateFound)
{
    ps.add(p1);
}
11
ответ дан Community 17 August 2018 в 09:02
поделиться

Причина?

Итераторы, возвращенные ArrayList в природе fail-fast.

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

Где этот итератор приходит из в то время как я его не использую?

Для расширенного цикла для коллекций Iterator используется, поэтому вы не можете вызывать метод add во время повтора.

Итак, ваш цикл то же, что и ниже

for (Iterator<Entry> i = c.iterator(); i.hasNext(); ){   

Что такое решение? Тогда?

Вы можете вызвать iterator.add(); и изменить цикл на основе итератора явно, а не неявно.

    String inputWord = "john";
    ArrayList<String> wordlist = new ArrayList<String>();
    wordlist.add("rambo");
    wordlist.add("john");
    for (ListIterator<String> iterator = wordlist.listIterator(); iterator
            .hasNext();) {
        String z = iterator.next();
        if (z.equals(inputWord)) {
            iterator.add("3");
        }
    }
    System.out.println(wordlist.size());

Теперь, где я могу узнать больше?

  1. Для каждой петли
  2. ArrayList Java docs
4
ответ дан Amit Deshpande 17 August 2018 в 09:02
поделиться
  • 1
    выполняется ли CME только в том случае, если итератор используется для перебора элементов коллекции и изменения их? – Bionix1441 12 September 2017 в 07:47
Другие вопросы по тегам:

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