Домой Учебники по Java и J2EE Когда я должен использовать CopyOnWriteArrayList Vs. ArrayList в Java? Избегайте исключений java.util.ConcurrentModification

Когда я должен использовать CopyOnWriteArrayList Vs. ArrayList в Java? Избегайте исключений java.util.ConcurrentModification

358
0

java.util.List упорядоченная коллекция также известна sequence , Arraylist это очень простая реализация List , Есть ряд статей, которые я публиковал ранее в Crunchify, в списке ArrayList конвертируем HashMap в ArrayList , находим уникальные значения из ArrayList и т. Д.

В этом уроке мы рассмотрим, почему мы могли бы использовать CopyOnWriteArrayList избежать java.util.ConcurrentModificationException ,

Давайте начнем:

  1. Создать класс CrunchifyCopyOnWriteArrayList.java
  2. Создать список companies
  3. Добавьте 5 значений к companies и перебрать список
  4. Во время итерации изменить (добавить / удалить) элементы из списка
  5. Вы увидите ConcurrentModificationException, потому что его внутренний modCount было то, что предупредило итератор
  6. Теперь просто комментарий line 18 и раскомментируйте line 21 и перезапустите программу.
CrunchifyCopyOnWriteArrayList.java

Джава
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
пакет crunchify. ком . учебные пособия ;
Импортировать Java. Util. ArrayList ;
Импортировать Java. Util. Итератор ;
Импортировать Java. Util. Список ;
Импортировать Java. Util. одновременно. CopyOnWriteArrayList ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyCopyOnWriteArrayList {
общественности статический недействительным main ( Строка [ ] аргументы ) {
// Отключаем это, чтобы избежать ConcurrentModificationException
Список компании знак равно новый ArrayList < > ( ) ;
// Включаем это, чтобы избежать ConcurrentModificationException
// List companies = new CopyOnWriteArrayList <> ();
компании . добавить ( Google ) ;
компании . добавить ( «Yahoo» ) ;
компании . добавить ( Facebook ) ;
компании . добавить ( eBay ) ;
компании . добавить ( «Microsoft» ) ;
// Получить итератор для коллекции. Итератор занимает место
// Перечисление в платформе коллекций Java.
Итератор crunchifyIterator знак равно компании . итератор ( ) ;
// Вносить изменения в список компаний при выполнении hasNext ()
в то время как ( crunchifyIterator . hasNext ( ) ) {
Система. вне. println ( список компаний: + компании ) ;
строка crunchifyString знак равно crunchifyIterator . следующий ( ) ;
// Test1: инструкция ниже вызывает ConcurrentModificationException
Система. вне. println ( crunchifyString ) ;
если ( crunchifyString . equals ( Yahoo ) )
// modCount = 6
компании . удалить ( «Microsoft» ) ;
если ( crunchifyString . equals ( eBay ) )
компании . add ( Мое сообщение отправляется сюда … eBay present ) ;
// Test2: ниже изменения не будет выбрасывать ConcurrentModificationException
// Причина: она не меняет переменную modCount companies
если ( crunchifyString . equals ( Google ) )
компании . набор ( 2 , Гугл ) ;
}
}
}

Почему java.util.ConcurrentModificationException:

Point-1)

После добавления всех 5 компаний в список вы увидите modCount = 5 , size = 5

Point-2)

После удаления элемента «Microsoft» вы увидите modCount = 6 , size = 4 что вызывает исключение.

Как решить java.util.ConcurrentModificationException

Просто используйте CopyOnWriteArrayList вместо ArrayList в вышеуказанной программе. Во время отладки вы увидите, что он добавит ReentrantLock на объекте.

Когда я должен использовать CopyOnWriteArrayList Vs. ArrayList в Java? Избегайте исключений java.util.ConcurrentModification

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Как найти все перестановки строки в Java - пример

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь