在Java中,存储大型列表的内存效率最高的方法是什么

时间:2015-02-27 11:52:56

标签: java performance list arraylist

我必须比较两个大的整数数组(大约150,000个值)来查看哪些值是唯一的,哪些不是。我希望输出存储在三个数据结构中,UniqueTo_A,UniqueTo_B& SharedElements。我会普遍使用像ArrayList这样的操作,因为值可以临时添加,但是我知道add()和remove()的开销对于ArrayLists来说相当大。所以我的问题是: - 在Java中,存储大型列表的内存效率最高的方法是什么,可以动态添加项目,性能是关键。所有帮助或评论将不胜感激。

编辑: 谢谢你输入的人。 TheLostMind,我需要添加到数据集,但Hashset将促进这一点,所以我将继续使用Hashset。 Nafas + NeplatnyUdaj感谢您的例子。埃克尔斯,我应该掌握收藏品,我将研究这个用于另一次。实施遵循......

2 个答案:

答案 0 :(得分:1)

我不认为列表是一种非常好的方法。你需要保留元素的顺序吗?单个列表可以包含重复的条目吗?如果没有,那么我会像这样使用HashSets:

    //initialization
    Random r = new Random();
    Set<Integer> aSet = new HashSet<Integer>();
    Set<Integer> bSet = new HashSet<Integer>();
    for (int i = 0; i< 150000; i++){
        aSet.add(r.nextInt());
        bSet.add(r.nextInt());
    }

    //Computation
    Set<Integer> aUnique = new HashSet<Integer>();
    Set<Integer> bUnique = new HashSet<Integer>(bSet); //we will remove duplicate entries later
    Set<Integer> shared = new HashSet<Integer>();
    for (Integer aval: aSet){
        if (bSet.contains(aval)){
            shared.add(aval);
        }else{
            aUnique.add(aval);
        }
    }
    bUnique.removeAll(shared);

最后,您可以根据要求获得三套(aUniquebUniqueshared

答案 1 :(得分:1)

使用Set,因为,adds在恒定时间内,removes在恒定时间内有多个值。我每天使用set,有超过数百万个存储的对象。并且removeAll仍然在几毫秒内

Set<Integer> setA= new HashSet<Integer>();
Set<Integer> setB= new HashSet<Integer>();

//add stuff to setA and setB by add() method

Set<Integer> uniqueToA=new HashSet<Integer>(setA);
Set<Integer> uniqueToB=new HashSet<Integer>(setB);
Set<Integer> shared=new HashSet<Integer>();
shared.addAll(setA);
shared.addAll(setB);

uniqueToA.removeAll(setB);
uniqueToB.removeAll(setA);

shared.removeAll(uniqueToA);
shared.removeAll(uniqueToB);

System.out.println(uniqueToA);  //unique to A
System.out.println(uniqueToB); //unique To B
System.out.println(shared);  //shared