Java列表removeAll(Collection)示例

本文详细介绍了Java List的removeAll()方法,包括ArrayList和LinkedList的示例,以及可能出现的UnsupportedOperationException和NullPointerException情况。文章指出,当元素没有正确实现equals()和hashCode()方法时,removeAll()可能无法正常工作,并提供了相关示例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

Java List removeAll()方法将删除其所有在给定列表中也存在的元素。 如果列表不支持该操作,则该方法将引发UnsupportedOperationException。

If the given collection is null, NullPointerException is thrown.

如果给定的集合为null,则抛出NullPointerException

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

如果更改列表,则此方法返回true ,否则返回false

Java列表removeAll()示例 (Java List removeAll() Examples)

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

让我们看一下带有不同类型的列表实现的removeAll()方法的一些示例。

1. ArrayList removeAll()示例 (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()示例 (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.列出removeAll()UnsupportedOperationException (3. List removeAll() UnsupportedOperationException)

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

如果我们在U​​nmodifiable列表上调用removeAll()方法,则将获得UnsupportedOperationException。

List.of() method returns an Unmodifiable list.

List.of()方法返回一个不可修改的列表。

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

Java列表removeAll()UnsupportedOperationException

4.列出removeAll()NullPointerException (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

Java列表removeAll()NullPointerException

5. Java列表removeAll()不起作用 (5. Java List removeAll() Not Working)

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

如果查看ArrayList / LinkedList中的removeAll()方法的实现,则它在内部使用以下方法。

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.

因此,列表元素必须具有equals()和hashCode()方法的正确实现。 否则,您将得到不想要的结果。

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.

这是一个示例,其中未对List元素实现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<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.

看来removeAll()方法不起作用。 现在让我们将equals()和hashCode()方法实现添加到Record类。

@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.

现在removeAll()方法正在按预期工作。 因此,每当您感到removeAll()操作未按预期工作时,请检查list elements类中的equals()和hashCode()实现。

参考资料 (References)

翻译自: https://www.journaldev.com/31875/java-list-removeall-collection-examples

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值