Java的几个List集合操作

Posted bisal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的几个List集合操作相关的知识,希望对你有一定的参考价值。

碰到一个需求,文件夹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<? extends E> 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

近期更新的文章:

SQL Server删除带“默认值”字段的需求探索

最近碰到的一些问题

体验云资源

学习Oracle的三种境界

InnoDB快速定位行锁争用会话的过程和操作

文章分类和索引:

《公众号800篇文章分类和索引

以上是关于Java的几个List集合操作的主要内容,如果未能解决你的问题,请参考以下文章

Java集合与泛型中的几个陷阱,你掉进了几个?

JavaEE的几个题

JAVA中List的几个方法

java集合类源码分析之List

常用的几个JQuery代码片段

操作list的几个基础函数