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

时间:2014-05-12 18:48:26

标签: 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 = new HashSet<Integer>(b);

        for(Iterator<Integer> it = aSet.iterator(); it.hasNext();) {
            if(!bSet.contains(it.next())) it.remove();
        }
        return new ArrayList<Integer>(aSet);
    }

就时间而言它是高效的但是我有很多内存泄漏而且我经常会内存不足。如何在时间和空间上提高性能?

更新

输入中给出的arraylists必须保持不变。

2 个答案:

答案 0 :(得分:2)

一个解决方案(性能)就是使用像这样的SortedSet

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);
}

另一个解决方案(用于空间)将使用传递的List(s),如此( EDITED 带有“新要求”,传递的List(s)不变),

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;
}

答案 1 :(得分:0)

首先,您不需要HashSets,您可以使用一个HashSet执行此操作。

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