在 Java 中,存储大型列表的内存效率最高的方法是什么
In Java, what is the most memory efficient way to store large lists
我必须比较两个大型整数数组(大约 150,000 个值)以查看哪些值是唯一的,哪些不是。我希望输出存储在三个数据结构中,UniqueTo_A、UniqueTo_B 和 SharedElements。对于这种操作,我通常会使用类似 ArrayList 的东西,因为可以添加值 ad-hoc,但是我知道 add() 和 remove() 的开销对于 ArrayLists 来说相当大。所以我的问题是:- 在 Java 中,存储大型列表的内存效率最高的方法是什么,可以动态添加项目,性能是关键。所有帮助或意见将不胜感激。
编辑:
感谢您输入的人。 TheLostMind,我将需要添加到数据集,但 Hashset 会促进这一点,所以我将继续使用 Hashset。 Nafas + NeplatnyUdaj 感谢您提供示例。 Eckles,我应该掌握 collections 我会研究这个以备下次使用。后续实施....
我认为列表不是一个很好的方法。您需要保留元素的顺序吗?单个列表可以包含重复的条目吗?如果没有,那么我会像这样使用 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);
最后,你得到了三套要求(aUnique
,bUnique
和shared
)
使用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
我必须比较两个大型整数数组(大约 150,000 个值)以查看哪些值是唯一的,哪些不是。我希望输出存储在三个数据结构中,UniqueTo_A、UniqueTo_B 和 SharedElements。对于这种操作,我通常会使用类似 ArrayList 的东西,因为可以添加值 ad-hoc,但是我知道 add() 和 remove() 的开销对于 ArrayLists 来说相当大。所以我的问题是:- 在 Java 中,存储大型列表的内存效率最高的方法是什么,可以动态添加项目,性能是关键。所有帮助或意见将不胜感激。
编辑: 感谢您输入的人。 TheLostMind,我将需要添加到数据集,但 Hashset 会促进这一点,所以我将继续使用 Hashset。 Nafas + NeplatnyUdaj 感谢您提供示例。 Eckles,我应该掌握 collections 我会研究这个以备下次使用。后续实施....
我认为列表不是一个很好的方法。您需要保留元素的顺序吗?单个列表可以包含重复的条目吗?如果没有,那么我会像这样使用 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);
最后,你得到了三套要求(aUnique
,bUnique
和shared
)
使用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