Java基础-集合类-ArrayList retainAll() 方法

    科技2024-08-17  29

    一、 retainAll 方法

    retainAll() 方法用于保留 arraylist 中在指定集合中也存在的那些元素,也就是删除指定集合中不存在的那些元素。

    retainAll() 方法的语法为:

    arraylist.retainAll(Collection c);

    源码为:

    public boolean retainAll(Collection<?> c) { //调用自己的私有方法 return batchRemove(c, true); }

    参数说明:

    collection - 集合参数

    返回值 如果 arraylist 中删除了元素则返回 true。

    如果 arraylist 类中存在的元素与指定 collection 的类中元素不兼容,则抛出 ClassCastException 异常。

    如果 arraylist 包含 null 元素,并且指定 collection 不允许 null 元素,则抛出 NullPointerException 。

    二、batchRemove 方法解析

    如果此 collection 由于调用而发生更改,则返回 true

    //集合A比较与集合B的交集 private boolean batchRemove(Collection<?> c, boolean complement) { //获得当前对象的所有元素 final Object[] elementData = this.elementData; //w:标记两个集合公共元素的个数 int r = 0, w = 0; //设置标志位 boolean modified = false; try { //遍历集合A for (; r < size; r++) //判断集合B中是否包含集合A中的当前元素 if (c.contains(elementData[r]) == complement) //如果包含则直接保存。 elementData[w++] = elementData[r]; } finally { // 如果 c.contains() 抛出异常 if (r != size) { //复制剩余的元素 System.arraycopy(elementData, r, elementData, w, size - r); //w为当前集合A的length w += size - r; } //如果集合A的大小放生改变 if (w != size) { // 清除工作 for (int i = w; i < size; i++) elementData[i] = null; //记录集合中元素的改变(add/remove) modCount += size - w; //设置当前数组的大小 size = w; //返回为true modified = true; } } return modified; }

    1、关于modCount变量的说明 AbstractList包含一个modCount变量,它的初始值是0,当集合中的内容每被修改一次时(调用add(), remove()等方法),modCount加1

    2、关于返回值的说明 如果集合A数组的大小没有改变,则返回false。如果集合A和集合B是完全相同的集合,也会返回false。

    public static void main(String[] args) { ArrayList<String> listA= new ArrayList<String>(); listA.add("Tom"); ArrayList<String> listB= new ArrayList<String>(); listB.add("Tom"); System.out.println(listA.retainAll(listB)); //false }

    即使两个集合没有交集,也会返回true。

    public static void main(String[] args) { ArrayList<String> listA= new ArrayList<String>(); listA.add("Tom"); ArrayList<String> listB= new ArrayList<String>(); listB.add("Jack"); System.out.println(listA.retainAll(listB));//true }

    所以,我们要记住:当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False。

    三、正确的使用 retainAll 方法

    1、sites.retainAll(sites2)意义上为:sites 删除了不存在于 sites2 的元素 2、通过判断集合的大小,来确定是否存在交集

    import java.util.ArrayList; class Main { public static void main(String[] args){ // 创建一个动态数组 ArrayList<String> sites = new ArrayList<>(); sites.add("Google"); sites.add("Runoob"); sites.add("Taobao"); System.out.println("ArrayList 1: " + sites); // 创建另一个动态数组 ArrayList<String> sites2 = new ArrayList<>(); // 往动态数组中添加元素 sites2.add("Wiki"); sites2.add("Runoob"); sites2.add("Google"); System.out.println("ArrayList 2: " + sites2); // 保留元素 sites.retainAll(sites2); System.out.println("保留的元素: " + sites); } }

    执行以上程序输出结果为:

    ArrayList 1: [Google, Runoob, Taobao] ArrayList 2: [Wiki, Runoob, Google] 保留的元素: [Google, Runoob]

    实例中,我们传入了数组 sites2 作为 retainAll() 方法的参数。该方法从 sites 删除了不存在于 sites2 的元素。

    import java.util.ArrayList; import java.util.HashSet; class Main { public static void main(String[] args) { // 创建一个数组 ArrayList<Integer> numbers = new ArrayList<>(); // 往数组中添加元素 numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("ArrayList: " + numbers); // 创建一个HashSet对象 HashSet<Integer> primeNumbers = new HashSet<>(); // 往 HashSet添加元素 primeNumbers.add(2); primeNumbers.add(3); primeNumbers.add(5); System.out.println("HashSet: " + primeNumbers); // 在arraylist中保留公共的元素 numbers.retainAll(primeNumbers); System.out.println("共有元素: " + numbers); } }

    执行以上程序输出结果为:

    ArrayList: [1, 2, 3] HashSet: [2, 3, 5] 共有元素: [2, 3]

    代码中,retainAll() 方法在 numbers 动态数组中删除了所有不存在于 primeNumbers 中的元素。

    Processed: 0.010, SQL: 8