Java中的Arraylist交集性能(在时间和空间上)

Java中的Arraylist交集性能(在时间和空间上),java,performance,out-of-memory,time-complexity,space-complexity,Java,Performance,Out Of Memory,Time Complexity,Space Complexity,我需要在java中创建数百万个ArrayList的交集,为此,我使用以下方法: public static ArrayList<Integer> intersection(ArrayList<Integer> a, ArrayList<Integer> b) { Set<Integer> aSet = new HashSet<Integer>(a); Set<Integer> bSet = n

我需要在java中创建数百万个ArrayList的交集,为此,我使用以下方法:

public static ArrayList<Integer> intersection(ArrayList<Integer> a, ArrayList<Integer> b) {
        Set<Integer> aSet = new HashSet<Integer>(a);
        Set<Integer> bSet = new HashSet<Integer>(b);

        for(Iterator<Integer> it = aSet.iterator(); it.hasNext();) {
            if(!bSet.contains(it.next())) it.remove();
        }
        return new ArrayList<Integer>(aSet);
    }
公共静态ArrayList交叉点(ArrayList a、ArrayList b){
Set aSet=新哈希集(a);
Set bSet=新哈希集(b);
for(Iterator it=aSet.Iterator();it.hasNext();){
如果(!bSet.contains(it.next()))包含它,则删除它;
}
返回新的ArrayList(aSet);
}
就时间而言,它是有效的,但我有很多内存泄漏,而且我经常内存不足。我如何改进功能,以便在时间和空间上都能发挥作用

更新


输入中给定的数组列表必须保持不变。

首先,您不需要
哈希集。
在这里,您可以使用单个
哈希集来执行此操作

将从第一个
ArrayList
到一个
HashSet
的所有内容添加到第二个'ArrayList'中,并迭代第二个'ArrayList',检查先前构造的
HashSet
中包含的每个元素,如果是这样,将其添加到结果
ArrayList

一个解决方案(为了性能)是使用类似的

公共静态列表交叉点2(列表a、列表b){
SortedSet aSet=新树集(a);
保留条款(b);
返回新的ArrayList(aSet);
}
另一个解决方案(空间)是使用传入列表,如(编辑的,带有“新要求”,即传入列表保持不变)

公共静态列表交叉3(列表a、列表b){

List c=new ArrayList(a);//为什么不使用
removeAll()
?为什么列表以
Set
s开头而不是
Set
has
.retainal()
removeAll()如果您不想自己编写代码,则最好选择
。他希望进行交叉,而不是将所有值从一个列表删除到另一个列表。
retainal()
似乎是一个很好的方法。另外,如果你想经常使用集合,我建议你使用番石榴,并且有很多有用的方法。例如
set.intersection(set1,set2)
如果要进行真正的优化,那就是一次处理多个交叉点。在什么条件下进行交叉?你只是在数千个数组的列表中对每一对数组进行交叉还是什么?你知道需要提前完成哪些交叉点吗?很好的建议。集合确实更适合于或者类似的东西我已经用这段代码测试了你的方法()但它只在很少的ArrayList中运行。结果如下:。我还注意到您的第二个方法返回了错误的结果。@IvanZandoná这不是基准测试。我从未想过基准测试的健壮性。但是,我尝试过在我的应用程序中插入您的代码,性能大幅下降。我尝试过Guava库似乎是一个以时间性能为代价的解决方案!
public static List<Integer> intersection2(List<Integer> a, List<Integer> b) {
    SortedSet<Integer> aSet = new TreeSet<Integer>(a);
    aSet.retainAll(b);
    return new ArrayList<Integer>(aSet);
}
public static List<Integer> intersection3(List<Integer> a, List<Integer> b) {
    List<Integer> c = new ArrayList<Integer>(a); // <-- new requirement.
    c.retainAll(b);
    return c;
}