使用以下测试程序,我发现
数组列表
1000 个对象引用,从 arrayList 中删除 25%;
- 从现有的数组列表中删除;0.565ms
- 重新创建一个新的arrayList;0.573ms
100000 个对象引用,从 arrayList 中删除 25%;
- 从现有的数组列表中删除;1028毫秒
- 重新创建一个新的数组列表;8.66 毫秒
- 重新创建一个新的数组列表(预先调整大小);2毫秒
在小范围内这并不重要,在大范围内创建一个新列表是关键,最好是预先调整大小
哈希集
1000 个对象引用,从 arrayList 中删除 25%;
- 从现有的哈希集中删除;0.602ms
- 重新创建一个新的哈希集;2.64 毫秒
100000 个对象引用,从 arrayList 中删除 25%;
- 从现有的哈希集中删除;28ms
- 重新创建一个新的哈希集;37毫秒
在小规模上,从现有集合中移除似乎更快,但两者在重要的规模上都是可比的。
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import javax.vecmath.Vector3d;
public class Test {
public static void main(String[] args){
voidTestArrayList(100000);
voidTestHashSet(100000);
}
public static void voidTestArrayList(int samples){
{
Collection<Vector3d> collectionArrayList=new ArrayList<Vector3d>();
preamble(collectionArrayList,samples);
testRemoveQuarter(collectionArrayList);
}
{
Collection<Vector3d> collectionArrayList2=new ArrayList<Vector3d>();
Collection<Vector3d> collectionArrayListDestination=new ArrayList<Vector3d>();
preamble(collectionArrayList2,samples);
testRetain3Quarter(collectionArrayList2,collectionArrayListDestination);
}
{
Collection<Vector3d> collectionArrayList3=new ArrayList<Vector3d>();
preamble(collectionArrayList3,samples);
Collection<Vector3d> collectionArrayListDestination3=new ArrayList<Vector3d>(collectionArrayList3.size());
testRetain3QuarterPresized(collectionArrayList3,collectionArrayListDestination3);
}
}
public static void voidTestHashSet(int samples){
Collection<Vector3d> collectionHashSet=new HashSet<Vector3d>();
preamble(collectionHashSet,samples);
testRemoveQuarter(collectionHashSet);
Collection<Vector3d> collectionHashSet2=new HashSet<Vector3d>();
Collection<Vector3d> collectionHashSetDestination=new HashSet<Vector3d>();
preamble(collectionHashSet2,samples);
testRetain3Quarter(collectionHashSet2,collectionHashSetDestination);
}
public static void voidTestRemoveFromArrayList(){
Collection<Vector3d> collectionArrayList=new ArrayList<Vector3d>();
preamble(collectionArrayList,1000);
testRemoveQuarter(collectionArrayList);
}
public static void preamble(Collection<Vector3d> collection, int numberToAdd){
//not part of timed test
for(int i=0;i<numberToAdd;i++){
collection.add(new Vector3d(Math.random(),Math.random(),Math.random()));
}
}
public static void testRemoveQuarter(Collection<Vector3d> collection){
Iterator<Vector3d> iterator=collection.iterator();
int counter=0;
while(iterator.hasNext()){
counter++;
iterator.next();
if ((counter%4)==0){
counter=0;
iterator.remove();
}
}
}
public static void testRetain3QuarterPresized(Collection<Vector3d> collection, Collection<Vector3d> destinationCollection){
testRetain3Quarter(collection, destinationCollection);
}
public static void testRetain3Quarter(Collection<Vector3d> collection, Collection<Vector3d> destinationCollection){
Iterator<Vector3d> iterator=collection.iterator();
int counter=0;
while(iterator.hasNext()){
counter++;
Vector3d processing=iterator.next();
if ((counter%4)!=0){
counter=0;
destinationCollection.add(processing);
}
}
}
}
注意重要的是要注意,就集合而言,它包含对对象的引用,因此我对特定对象类的选择是无关紧要的