Java取交集方法retainAll()

原文链接:Java取交集方法retainAll() – 编程屋

1 retainAll方法示例

如何判断一个集合与另外一个集合中有相同的元素

例如A.retainAll(B);

如果AB中有相同的元素,那么A中会保留相同的元素,将不同的元素移除

如果AB中没有相同的元素,那么会返回[]

当A中的元素有变化时会返回true,没有变化会返回false

    @Test
    public void test6(){
        List list1 = new ArrayList<>();
        List list2 = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list1.add(i);
            if (i%2 == 0 ){
                list2.add(i);
            }
        }
        System.out.println(list1); //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
        System.out.println(list2); //[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
        list1.retainAll(list2);
        System.out.println(list1); //[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    }

结果:

Java取交集方法retainAll()_第1张图片

2 源码解析

为了更好的解析源码,我们写一个简单的demo来打断点示例下

    @Test
    public void test6(){
        List list1 = new ArrayList<>();
        List list2 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list2.add(2);
        list1.retainAll(list2);
        System.out.println(list1); //2
    }

    boolean batchRemove(Collection c, boolean complement, int from, int end) {
  
        Objects.requireNonNull(c);  //获取list2的值
        Object[] es = this.elementData; // 获取源数据list1中的值

        for(int r = from; r != end; ++r) {  //循环判断list2中是否包含list1的元素,将相同的元素放入list1数组中
            if (c.contains(es[r]) != complement) { 
                int w = r++; 

                try {
                    for(; r < end; ++r) {
                        Object e;
                        if (c.contains(e = es[r]) == complement) {
                            es[w++] = e;
                        }
                    }
                } catch (Throwable var12) {
                    System.arraycopy(es, r, es, w, end - r);
                    w += end - r;
                    throw var12;
                } finally {
                    this.modCount += end - w;
                    this.shiftTailOverGap(es, w, end);
                }

                return true;
            }
        }

        return false;
    }
源码看了一半,实在看不下去了,等之后有机会在补充吧

Java取交集方法retainAll()_第2张图片

注意:我们不能根据判断返回的结果来判断二者集合是否有交集,应该判断list1中的长度是否有变化来判断,例如:

以上只是部分内容,为了维护方便,本文已迁移到新地址:Java取交集方法retainAll() – 编程屋

你可能感兴趣的:(Java基础,java,开发语言,后端)