文
章
目
录
章
目
录
在Java中,ArrayList.retainAll()方法仅保留在此列表中包含在指定集合中的元素,即两个集合元素的交集。列表中的所有其他元素都将被删除。这个方法与removeAll()方法正好相反,removeAll()方法是求差集。
1.语法
使用retainAll()方法的语法如下:
boolean retainAll(Collection<?> c);
- 方法参数 – 包含要从此列表中保留的元素的集合。
- 方法返回 – 如果此列表因调用而更改,则返回true。
- 方法抛出 – 如果此列表的元素类与指定的集合不兼容,则可能抛出ClassCastException。如果此列表包含一个null元素,而指定的集合不允许null元素,则也可能抛出NullPointerException。
2.使用retainAll()方法的Java程序
在以下程序中,我们有两个列表。当我们调用list1.retainAll(list2)时,程序会将list1中仅保留那些也存在于list2中的元素。
List<Integer> list1 = new ArrayList<>(Stream.of(1, 2, 3, 4, 5).toList());
List<Integer> list2 = new ArrayList<>(Stream.of(1, 2, 3, 6, 7).toList());
list1.retainAll(list2);
System.out.println(list1); //[1, 2, 3]
System.out.println(list2); //[1, 2, 3, 6, 7]
3. retainAll()方法的工作原理
在内部,retainAll()方法会迭代列表的所有元素。对于每个元素,它将元素传递给参数集合的contains()方法。
如果在参数集合中找不到该元素,则重新排列索引。如果找到该元素,则保留该元素在后台数组中。
public boolean retainAll(Collection<?> c) {
Objects.requireNonNull(c);
return batchRemove(c, true);
}
private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;
boolean modified = false;
try {
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
} finally {
// Preserve behavioral compatibility with AbstractCollection,
// even if c.contains() throws.
if (r != size) {
System.arraycopy(elementData, r,
elementData, w,
size - r);
w += size - r;
}
if (w != size) {
// clear to let GC do its work
for (int i = w; i < size; i++)
elementData[i] = null;
modCount += size - w;
size = w;
modified = true;
}
}
return modified;
}
这就是Java中ArrayList retainAll()方法的全部内容。