Автор оригинала: Pankaj Kumar.
Метод Java List removeAll() удаляет все его элементы, которые также присутствуют в данном списке. Метод создает исключение UnsupportedOperationException, если операция не поддерживается списком.
Если данная коллекция равна null, создается исключение NullPointerException.
Этот метод возвращает true , если список изменен, в противном случае false .
Список Java удалить Все() Примеры
Давайте рассмотрим некоторые примеры метода removal() с различными типами реализаций списков.
1. Пример удаления списка ArrayList()
Listlist = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("C"); list.add("B"); list.add("A"); System.out.println(list); List removeList = List.of("A", "B"); boolean isRemoved = list.removeAll(removeList); System.out.println(list); System.out.println(isRemoved);
Выход:
[A, B, C, C, B, A] [C, C] true
2. Список ссылок удалить все() Пример
ListlinkedList = new LinkedList<>(); linkedList.add(1); linkedList.add(2); linkedList.add(3); System.out.println(linkedList); boolean flag = linkedList.removeAll(List.of(1, 2)); System.out.println(linkedList); System.out.println(flag);
Выход:
[1, 2, 3] [3] true
3. Исключение List removeAll() UnsupportedOperationException
Если мы вызовем метод removeAll() в неизменяемом списке, мы получим исключение UnsupportedOperationException.
Метод List.of() возвращает неизменяемый список.
jshell> Listlist = List.of(1, 2); list ==> [1, 2] jshell> list.removeAll(List.of(1)); | Exception java.lang.UnsupportedOperationException | at ImmutableCollections.uoe (ImmutableCollections.java:72) | at ImmutableCollections$AbstractImmutableCollection.removeAll (ImmutableCollections.java:80) | at (#67:1) jshell>
4. Исключение List removeAll() NullPointerException
jshell> Listlist = new ArrayList<>(); list ==> [] jshell> list.removeAll(null); | Exception java.lang.NullPointerException | at Objects.requireNonNull (Objects.java:221) | at ArrayList.batchRemove (ArrayList.java:847) | at ArrayList.removeAll (ArrayList.java:822) | at (#71:1) jshell>
Исключение из списка Java removeAll() NullPointerException
5. Список Java удалить Все() Не работает
Если вы посмотрите на реализацию метода removeAll() в ArrayList/LinkedList, он использует следующие внутренние методы.
removeAll() -> contains() -> indexOf() -> indexOfRange() -> equals()
Таким образом, необходимо, чтобы элементы списка имели надлежащую реализацию методов equals() и hashCode (). В противном случае вы получите нежелательные результаты.
Вот пример, в котором метод equals() и hashCode() не реализован для элементов списка, а операция removeAll() работает не так, как ожидалось.
package com.journaldev.java;
import java.util.ArrayList;
import java.util.List;
public class ArrayListRemoveAll {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Record(1, "Hi"));
list.add(new Record(2, "Hello"));
list.add(new Record(3, "Howdy"));
System.out.println("Original List =" + list);
list.removeAll(List.of(new Record(1, "Hi"), new Record(2, "Hello")));
System.out.println("Updated List =" + list);
}
}
class Record {
private int id;
private String data;
Record(int i, String d) {
this.id = i;
this.data = d;
}
@Override
public String toString() {
return String.format("R{%d, %s}", this.id, this.data);
}
}
Выход:
Original List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]
Updated List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]
Похоже, что метод удаления() не работает. Теперь давайте добавим реализации методов equals() и hashCode() в класс записей.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Record other = (Record) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
if (id != other.id)
return false;
return true;
}
Обновленные Выходные данные:
Original List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]
Updated List =[R{3, Howdy}]
Теперь метод removeAll() работает так, как мы и ожидали. Поэтому всякий раз, когда вы чувствуете, что операция removeAll() работает не так, как ожидалось, проверьте реализации equals() и hashCode() в классе элементов списка.