前言:最近在修改别人做的一个Android 实时处理大量数据的app,结果手机、平板总是发烫厉害,
在找问题出在哪里,后来怀疑当初大量用了ArrayList,在这里做一个关于ArrayList和LinkedList的测试:
定义一个900,000,也就是90万长的数组,里面分别放1,2,3......900000,数组的每一个元素放进ArrayList和LinkedList里面去。
代码如下:
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import org.omg.CORBA.PRIVATE_MEMBER;
public class MyCollectionTest {
private static final int Num = 900000;
public static void main(String[] args)
{
String[] tst1 = new String[Num];
for (int i = 0; i < Num; i++)
{
tst1[i] = String.valueOf(i); //生成一个90万长的String数组
}
ArrayList<String> aL =new ArrayList<String>();
for (int i = 0; i < Num; i++)
{
aL.add(tst1[i]); //数组元素加到ArrayList里面
}
LinkedList<String> ll = new LinkedList<String>();
for (int i = 0; i < Num; i++)
{
ll.add(tst1[i]); //数组元素加到LinkedList里面
}
//测试1:先测试两者的迭代
long startTime = System.currentTimeMillis();
for(Iterator<String> iterator= aL.iterator();iterator.hasNext();)
{
iterator.next();
}
System.out.println("迭代ArrayList集合元素的时间:"+ (System.currentTimeMillis()-startTime));
startTime = System.currentTimeMillis();
for (Iterator<String> iterator= ll.iterator(); iterator.hasNext();)
{
iterator.next();
}
System.out.println("迭代LinkedList集合元素的时间:"+ (System.currentTimeMillis()-startTime));
//测试2,测试删除元素
long len1 = aL.size();
long len2 = ll.size();
startTime = System.currentTimeMillis();
for (int i = 0; i < len1; i++)
{
aL.remove(0);
}
System.out.println("删除ArrayList集合元素的时间:"+ (System.currentTimeMillis()-startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < len2; i++)
{
ll.remove(0);
}
System.out.println("删除linkedList集合元素的时间:"+ (System.currentTimeMillis()-startTime));
}
}
结果如下:
测试平台:
结论:
对于ArrayList和LinkedList来讲,迭代时间差不多,多次测试,两者迭代的速度交替领先,不好说优劣。
但是对于增加、删除操作,在这里,ArrayList是LinkedList的1000倍!
而当初的Android App用的数据大多是增加和删除(这个也是这里测试删除的原因),真的难为了手机了。。。
个人结论:
ArrayList是基于一个动态数组的List的实现类,比较适合通过下标来进行无规律存取,如:get(index)方法
而LinkedList是基于链表的LinkedList类,比较适合做增加、删除操作(底层通过修改引用的值就可以了)
ArrayList和LinkedList的兄弟关系
有空再测试增加和删除都进行的情况~
如有不当,请指教!