经典问题答案记录-ArrayList和LinkedList的区别
-
ArrayList的实现是基于数组来实现的,LinkedList的基于双向链表来实现。这两个数据结构的逻辑关系是不一样,当然物理存储的方式也会是不一样。
-
LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
-
对于随机访问(获取某一某些元素),ArrayList要优于LinkedList。
-
对于插入和删除操作,LinkedList优于ArrayList。
package com.jvm.memory.testDemo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class CompareListThird {
public static int max = 100000;//测试元素数
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Object> arrList = new ArrayList<Object>();
LinkedList<Object> linList = new LinkedList<Object>();
System.out.println("测试元素数:" + max);
System.out.println("ArrayList插入消耗的时间:" + insertTime(arrList) + "ms");
System.out.println("LinkedList插入消耗的时间:" + insertTime(linList) + "ms");
System.out.println("\nArrayList访问消耗的时间:" + getTime(arrList) + "ms");
System.out.println("LinkedList访问消耗的时间:" + getTime(linList) + "ms");
System.out.println("\nArrayList删除消耗的时间:" + delTime_v2(arrList) + "ms");
System.out.println("LinkedList删除消耗的时间:" + delTime_v2(linList) + "ms");
}
public static long insertTime(List list) {
long time = System.currentTimeMillis();
for (int i = 0; i < max; i++) {
list.add(i); // 逐个插入 max 个元素
}
return System.currentTimeMillis() - time;
}
public static long getTime(List list) {
long time = System.currentTimeMillis();
for (int i = 0; i < max; i++) {
int index = Collections.binarySearch(list, list.get(i));
if (index != i) {
System.out.println("ERROR!");
}
}
return System.currentTimeMillis() - time;
}
public static long delTime_v2(List list) {
long time = System.currentTimeMillis();
while (checkListSize(list)) {
if (list instanceof LinkedList) {
((LinkedList) list).removeFirst();
} else if (list instanceof ArrayList) {
list.remove(0);
}
}
return System.currentTimeMillis() - time;
}
public static boolean checkListSize(List list) {
if (list.size() <= 0)
return false;
else
return true;
}
}