ArrayList 的 retainAll() 方法如何工作
retainall() 方法用于从当前列表中移除所有未包含在指定集合中的元素,从而保留两个集合的交集。调用该方法后,原列表仅保留与参数集合共有的元素,其余元素被删除。此操作会修改原列表对象,并返回布尔值表示是否发生了变更。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RetainExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
List<String> collection = Arrays.asList("B", "D", "E");
boolean changed = list.retainAll(collection);
System.out.println("Changed: " + changed); // true
System.out.println("List: " + list); // [B, D]
}
}
不同集合类型对 retainAll() 的影响
当传入的参数集合是 HashSet 时,retainAll() 的执行效率通常高于 ArrayList,因为 HashSet 的 contains() 操作时间复杂度为 O(1)。如果参数也是 List,则每次检查元素是否存在的时间复杂度为 O(n),整体复杂度可能达到 O(n*m)。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class RetainPerformance {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E"));
List<String> arrayListParam = Arrays.asList("B", "D");
HashSet<String> hashSetParam = new HashSet<>(Arrays.asList("B", "D"));
// 使用 ArrayList 作为参数
List<String> list1 = new ArrayList<>(list);
long start1 = System.nanoTime();
list1.retainAll(arrayListParam);
long end1 = System.nanoTime();
System.out.println("ArrayList param result: " + list1);
// 使用 HashSet 作为参数
List<String> list2 = new ArrayList<>(list);
long start2 = System.nanoTime();
list2.retainAll(hashSetParam);
long end2 = System.nanoTime();
System.out.println("HashSet param result: " + list2);
}
}
retainAll() 处理空集合或重复元素的情况
如果传入的集合为空,retainAll() 将清空原列表,因为没有任何元素可以被保留。如果原列表包含重复元素且这些元素都在参数集合中,它们都会被保留,因为 retainAll() 基于元素的存在性而非唯一性进行过滤。返回值 false 仅在原列表内容与参数集合完全一致(即无需移除任何元素)时返回。
立即学习“Java免费学习笔记(深入)”;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RetainEdgeCases {
public static void main(String[] args) {
// 情况1:参数为空
List<String> list1 = new ArrayList<>(Arrays.asList("A", "B"));
List<String> empty = new ArrayList<>();
boolean r1 = list1.retainAll(empty);
System.out.println("Empty param: " + list1 + ", Changed: " + r1); // [], true
// 情况2:包含重复元素
List<String> list2 = new ArrayList<>(Arrays.asList("A", "A", "B"));
List<String> param = Arrays.asList("A");
boolean r2 = list2.retainAll(param);
System.out.println("Duplicates: " + list2 + ", Changed: " + r2); // [A, A], true
// 情况3:无变化
List<String> list3 = new ArrayList<>(Arrays.asList("A", "B"));
List<String> same = Arrays.asList("A", "B");
boolean r3 = list3.retainAll(same);
System.out.println("No change: " + list3 + ", Changed: " + r3); // [A, B], false
}
}


















