Java列表removeAll(Collection)示例
时间:2020-02-23 14:36:32 来源:igfitidea点击:
Java List removeAll()方法删除在给定列表中也存在的所有元素。
如果列表不支持该操作,则该方法引发UnsupportedOperationException。
如果给定的集合为null,则抛出NullPointerException。
如果列表已更改,则此方法返回" true",否则返回" false"。
Java列表removeAll()示例
让我们看一下带有不同类型的列表实现的removeAll()方法的一些示例。
1. ArrayList removeAll()示例
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);
输出:
[A, B, C, C, B, A] [C, C] true
2. LinkedList removeAll()示例
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);
输出:
[1, 2, 3] [3] true
3.列出removeAll()UnsupportedOperationException
如果我们在Unmodifiable列表上调用removeAll()方法,则会得到UnsupportedOperationException。
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>
4.列出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>
5. Java列表removeAll()不起作用
如果查看ArrayList/LinkedList中的removeAll()方法的实现,则它在内部使用以下方法。
removeAll() -> contains() -> indexOf() -> indexOfRange() -> equals()
因此,有必要使list元素正确实现equals()和hashCode()方法。
否则,您将得到不想要的结果。
这是一个示例,其中未为List元素实现equals()和hashCode()方法,并且removeAll()操作未按预期工作。
package com.theitroad.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); } }
输出:
Original List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}] Updated List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}]
看来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; }
更新的输出:
Original List =[R{1, Hi}, R{2, Hello}, R{3, Howdy}] Updated List =[R{3, Howdy}]
现在removeAll()方法正在按预期工作。
因此,每当您感到removeAll()操作未按预期工作时,请检查list elements类中的equals()和hashCode()实现。