ArrayList和LinkList的区别:
ArrayList:ArrayList是采用数组的形式保存对象,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。
LinkList:LinkList是将对象放在独立的节点中,每个节点保存下一个节点的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,必须从第一个开始遍历。
下面代码分别测试ArrayList、LinkList两种数据结构使用for、foreach遍历时的性能。
public class ForTest {
static int loopNum = 100000;
static long timeArrListFor ;
static long timeArrListForeach ;
static long timeLinkedListFor ;
static long timeLinkedListForeach ;
public static void main(String[] args) {
arrListTest();
linkedListTest();
System.out.println("timeArrListFor:" + timeArrListFor);
System.out.println("timeArrListForeach:" + timeArrListForeach);
System.out.println("timeLinkedListFor:" + timeLinkedListFor);
System.out.println("timeLinkedListForeach:" + timeLinkedListForeach);
}
static void arrListTest() {
ArrayList<Integer> arrList = new ArrayList();
for (int i = 0; i < loopNum; i++) {
arrList.add(i);
}
long time1 = System.currentTimeMillis();
for (int i = 0; i < arrList.size(); i++) {
System.out.println("i:" + arrList.get(i));
}
long time2 = System.currentTimeMillis();
for (Integer i : arrList) {
System.out.println("i:" + i);
}
long time3 = System.currentTimeMillis();
timeArrListFor = time2 - time1;
timeArrListForeach = time3 - time2;
}
static void linkedListTest() {
LinkedList<Integer> arrList = new LinkedList();
for (int i = 0; i < loopNum; i++) {
arrList.add(i);
}
long time4 = System.currentTimeMillis();
for (int i = 0; i < arrList.size(); i++) {
System.out.println("i:" + arrList.get(i));
}
long time5 = System.currentTimeMillis();
for (Integer i : arrList) {
System.out.println("i:" + i);
}
long time6 = System.currentTimeMillis();
timeLinkedListFor = time5 - time4;
timeLinkedListForeach = time6 - time5;
}
}
结果数据(单位ms):
timeArrListFor:565
timeArrListForeach:520
timeLinkedListFor:5517
timeLinkedListForeach:323
可见,ArrayList在使用for、foreach循环遍历时,性能差别不大。 但是,LinkedList在使用for、foreach遍历时,性能有15倍左右的差别,而且LinkedList使用foreach遍历性能要好于ArrayList。
结论: 对于有数组使用的场景,如果循环遍历较多,可以多使用LinkedList代替ArrayList。