Java List removeAll(Collection) Examples

Filed Under: Java

Java List removeAll() method removes all of its elements that are also present in the given list. The method throws UnsupportedOperationException if the operation is not supported by the list.

If the given collection is null, NullPointerException is thrown.

This method returns true if the list is changed, otherwise false.

Java List removeAll() Examples

Let’s look at some examples of removeAll() method with different types of list implementations.

1. ArrayList removeAll() Example


List<String> 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<String> removeList = List.of("A", "B");

boolean isRemoved = list.removeAll(removeList);
System.out.println(list);
System.out.println(isRemoved);

Output:


[A, B, C, C, B, A]
[C, C]
true

2. LinkedList removeAll() Example


List<Integer> 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);

Output:


[1, 2, 3]
[3]
true

3. List removeAll() UnsupportedOperationException

If we invoke removeAll() method on an Unmodifiable list, we will get UnsupportedOperationException.

List.of() method returns an Unmodifiable list.


jshell> List<Integer> 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> 
Java List RemoveAll UnsupportedOperationException

Java List removeAll() UnsupportedOperationException

4. List removeAll() NullPointerException


jshell> List<Integer> 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 List RemoveAll NullPointerException

Java List removeAll() NullPointerException

5. Java List removeAll() Not Working

If you look at the implementation of removeAll() method in ArrayList/LinkedList, it uses following methods internally.


removeAll() -> contains() -> indexOf() -> indexOfRange() -> equals()

So, it’s necessary that the list elements have proper implementation of equals() and hashCode() methods. Otherwise, you will get unwanted results.

Here is an example where the equals() and hashCode() method is not implemented for the List elements and the removeAll() operation is not working as expected.


package com.journaldev.java;

import java.util.ArrayList;
import java.util.List;

public class ArrayListRemoveAll {

	public static void main(String[] args) {
		List<Record> 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);
	}
}

Output:


Original List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]
Updated List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]

It seems that the removeAll() method is not working. Now let’s add equals() and hashCode() method implementations to the Record class.


@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;
}

Updated Output:


Original List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]
Updated List =[R{3, Howdy}]

Now the removeAll() method is working as we expected. So whenever you feel that the removeAll() operation is not working as expected, check the equals() and hashCode() implementations in the list elements class.

References

Comments

  1. naga says:

    What library do you use to make those code blocks

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages