1.ArrayList是实现了基于动态数组(Object[])的数据结构,LinkedList基于链表的数据结构(Node)。
2.ArrayList初始长度为10,扩容后为1.5*oldCapacity。
3.ArrayList的空间浪费主要体现在扩容后结尾会预留一定的容量空间(可以调用trimSize),LinkedList空间花费体现在它的每个元素新建都需要一定的空间(new Node对象)。
4.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
5.插入数据时,如果是在集合的前段(大概集合容量的前1/10)处插入数据时,LinkedList性能明显优于ArrayList;
当在集合的中部甚至靠后的位置插入大量数据时,ArrayList的性能反而远远优于LinkedList。
结论:Linkedlist相较于ArrayList的唯一优势在于集合前段的数据的插入。
具体Demo:
/**
* Created by flh on 2017/8/28.
*/
import java.util.*;
public class ArrayOrLinked {
static List<Integer> array=new ArrayList<Integer>();
static List<Integer> linked=new LinkedList<Integer>();
public static long getTime(List list){
long time=System.currentTimeMillis();
for(int i=0;i<10000;i++){
int index=Collections.binarySearch(list, list.get(i));
if(index!=i){
System.out.println("ERROR!");
}
}
return System.currentTimeMillis()-time;
}
public static long insertTime(List list){
long time=System.currentTimeMillis();
for(int i=1000;i<10000;i++){
list.add(1000, i);
}
return System.currentTimeMillis()-time;
}
public static void main(String[] args) {
for(int i=0;i<10000;i++){
array.add(i);
linked.add(i);
}
System.out.println("array time:"+getTime(array));
System.out.println("linked time:"+getTime(linked));
System.out.println("array insert time:"+insertTime(array));
System.out.println("linked insert time:"+insertTime(linked));
}
}
注意insertTime方法中:
list.add(1000, i);
在十分之一处进行插入,运行结果为:
array time:4
linked time:258
array insert time:26
linked insert time:19
在前部分插入,效率LinkedList>ArrayLsit
代码改为:
list.add(5000, i);
在二分之一处进行插入,运行结果为:
array time:3
linked time:249
array insert time:18
linked insert time:90
在中部及后半部分插入,效率ArrayLsit>LinkedList