Безопасное удаление элементов из коллекции - критически важный навык для Android-разработчика, так как неправильные подходы могут привести к ConcurrentModificationException
или другим ошибкам. Рассмотрим основные методы.
Самая частая ошибка при работе с коллекциями:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String item : list) {
if (item.equals("B")) {
list.remove(item); // Выбросит ConcurrentModificationException
}
}
Проблема возникает при модификации коллекции во время итерации.
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("B")) {
iterator.remove(); // Безопасное удаление
}
}
list.removeIf(item -> item.equals("B"));
List<String> copy = new ArrayList<>(list);
for (String item : copy) {
if (item.equals("B")) {
list.remove(item);
}
}
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i).equals("B")) {
list.remove(i);
}
}
list = list.stream()
.filter(item -> !item.equals("B"))
.collect(Collectors.toList());
val list = mutableListOf("A", "B", "C")
val iterator = list.iterator()
while (iterator.hasNext()) {
if (iterator.next() == "B") {
iterator.remove()
}
}
list.removeAll { it == "B" }
list = list.filterNot { it == "B" }.toMutableList()
Метод | Время выполнения | Читаемость | Универсальность |
---|---|---|---|
Iterator | Среднее | Низкая | Высокая |
removeIf | Высокое | Высокая | Только Java 8+ |
Обратный проход | Высокое | Средняя | Только списки |
Потоки | Низкое | Высокая | Только Java 8+ |
Kotlin removeAll | Высокое | Очень высокая | Только Kotlin |
removeIf
removeAll
/filterNot
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// Удаление с синхронизацией
synchronized(syncList) {
syncList.removeIf(...);
}
безопасное удаление элементов требует понимания механизмов работы коллекций. Выбор метода зависит от языка (Java/Kotlin), версии API и конкретного сценария использования. В Android-разработке особенно важно учитывать производительность операций, так как они могут выполняться в UI-потоке.