Рубрики
Без рубрики

Примеры удаления всех списков Java(Коллекции)

Метод Java List removeAll() удаляет все его элементы, которые также присутствуют в данном списке. Метод вызывает исключение UnsupportedOperationException, если

Автор оригинала: Pankaj Kumar.

Метод Java List removeAll() удаляет все его элементы, которые также присутствуют в данном списке. Метод создает исключение UnsupportedOperationException, если операция не поддерживается списком.

Если данная коллекция равна null, создается исключение NullPointerException.

Этот метод возвращает true , если список изменен, в противном случае false .

Список Java удалить Все() Примеры

Давайте рассмотрим некоторые примеры метода removal() с различными типами реализаций списков.

1. Пример удаления списка ArrayList()

List list = 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. Список ссылок удалить все() Пример

List linkedList = 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> List list = 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> List list = 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() в классе элементов списка.

Рекомендации