前言:最近在修改別人做的一個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的兄弟關係
有空再測試增加和刪除都進行的情況~
如有不當,請指教!