新闻、帮助、产品更新动态

最新的业界新闻,产品系统更新开发动态,帮助教程和活动发布

Java的几个List集合操作

发布日:2021-11-22 14:40       阅读数:

碰到一个需求,文件夹1和文件夹2,各自有很多文件,要得到文件夹1中出现,但未在文件夹2出现的文件。
 
这个需求其实可以归到集合的操作,文件夹1作为List1,文件夹2作为List2,取List1和List2的差集,Java通过removeAll函数,可以实现,
list1.removeAll(list2);
查看ArrayList的removeAll的源码,他调用的batchRemove(),
public boolean removeAll(Collection c) {
    Objects.requireNonNull(c);
    return batchRemove(c, false);
}
再看batchRemove的源码,如果传的第二个参数是false,保留差集,如果传的是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;
}
因此,removeAll(list2)默认调用false,将不包含的元素进行存储,实现了差集功能,
if (c.contains(elementData[r]) == complement)
    elementData[w++] = elementData[r];
除此之外,List还可以实现其他的集合操作,捎带手了解下。
 
1. 并集(不去重)
public static void test(List list1, List list2) {
    list1.addAll(list2);
    System.out.println(list1);
}
看一下ArrayList的addAll()源码,做的是数组复制,
public boolean addAll(Collection c) {
    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityInternal(size + numNew);  // Increments modCount
    System.arraycopy(a, 0, elementData, size, numNew);
    size += numNew;
    return numNew != 0;
}
2. 求并集(去重)
 
这需要通过组合操作,例如List1和List2的并集,先将List1和List2重复的删除,然后将List2的元素都加进来,
public static void test1(List list1, List list2) {
    list1.removeAll(list2);
    list1.addAll(list2);
    System.out.println(list1);
}
3. 求交集
public static void test2(List list1, List list2) {
    list1.retainAll(list2);
    System.out.println(list1);
}
我们看retainAll()的源码,他其实调用的,就是这个batchRemove()函数,但是第二个参数,给的是true,所以这两种操作,都可以实现交集,
public boolean retainAll(Collection c) {
    Objects.requireNonNull(c);
    return batchRemove(c, true);
}
参考,
 
https://www.cnblogs.com/qlqwjy/p/9812919.html


















 

编辑:航网科技   来源:腾讯云

本文版权归原作者所有 转载请注明出处

联系我们

客服部:深圳市龙华区龙胜商业大厦5楼B5区

业务部:深圳市南山区讯美科技广场2栋12楼1202

资质证书

  • Copyright © 2011-2020 www.hangw.com. All Rights Reserved 深圳航网科技有限公司 版权所有 增值电信业务经营许可证:粤B2-20201122 - 粤ICP备14085080号

    在线客服

    微信扫一扫咨询客服


    全国免费服务热线
    0755-36300002

    返回顶部