2025年01月20日 Java8 retainAll操作 极客笔记
在Java中,retainAll
是集合类中的一种用于操作集合的方法之一。它用于在一个集合中保留另一个集合中存在的元素,即交集操作。在Java 8中,该方法得到了优化以提高性能和效率。
retainAll
方法是Collection
接口中定义的方法,用于比较两个集合,保留两个集合中都包含的元素,即取交集。其方法签名为:
boolean retainAll(Collection<?> c)
该方法会修改调用该方法的集合,将其中保存了传入集合中存在的元素,而移除其他元素。返回值为true
表示调用集合发生了变化,false
表示未发生改变。调用方法后,调用集合中只会保留与传入集合的交集元素。
下面将给出一个示例,展示如何使用retainAll
方法来对两个List进行取交集操作。
import java.util.ArrayList;
import java.util.List;
public class RetainAllExample {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(3);
list2.add(4);
boolean result = list1.retainAll(list2);
System.out.println("List1: " + list1);
System.out.println("List2: " + list2);
System.out.println("Result: " + result);
}
}
运行以上代码,输出如下:
List1: [2, 3]
List2: [2, 3, 4]
Result: true
从输出可以看出,调用retainAll
方法后,List1中只保留了与List2中相同的元素2和3,List2中未发生变化,返回值为true
表示有元素被移除。
在Java 8中,retainAll
方法得到了优化以提高性能和效率。对于实现了List
接口的集合,新的retainAll
方法会使用removeIf
方法来实现交集操作,而不再采用迭代器和contains
方法进行遍历比对。
以下是Java 8中List
接口对retainAll
方法进行优化的源码片段:
public default boolean retainAll(Collection<?> c) {
Objects.requireNonNull(c);
boolean modified = false;
Iterator<E> it = iterator();
while (it.hasNext()) {
if (!c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}
相对于旧版的retainAll
方法,Java 8中使用更为高效的removeIf
方法,避免了迭代器和contains
方法的反复遍历。
retainAll
方法能够方便地对集合进行交集操作,保留两个集合中相同的元素。在Java 8中,该方法得到了优化以提高性能和效率,对于List
接口的集合,新的retainAll
方法会使用removeIf
来实现操作。
本文链接:http://so.lmcjl.com/news/21714/