Java List retainAll()方法求集合交集

培训教学 潘老师 7个月前 (10-09) 162 ℃ (0) 扫码查看

在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()方法的全部内容。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9400.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】