ArrayList和LinkedList区别:
1. ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
2. 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针;
3. 对于add和remove,一般大家会说LinkedList要比ArrayList快,因为ArrayList要移动数据。但实际情况并非如此,对于添加或删除,LinkedList和ArrayList并不能明确说明谁快谁慢,下面会详细分析。
ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,但是还是比ArrayList要慢。这点是毋庸置疑的。
ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素;LinkedList主耗时的是要先通过for循环找到index,然后直接插入或删除。这就导致了两者并非一定谁快谁慢,下面通过一个测试程序来测试一下两者插入的速度:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ArrayOrLinked {
static List<Integer> linked = new LinkedList<Integer>();
static List<Integer> array = new ArrayList<Integer>();
public static void main(String[] args) {
//首先分别给两者插入10000条数据
for (int i = 0; i < 10000; i++) {
array.add(i);
linked.add(i);
}
//获得两者插入数据的时间
System.out.println("array insert time:" + insertTime(array));
System.out.println("linked insert time:" + insertTime(linked));
}
//插入数据
public static long insertTime(List<Integer> list) {
/*
* 插入的数据量和插入的位置是决定两者性能的主要方面,
* 我们可以通过修改这两个数据,来测试两者的性能
*/
long num = 10000; //表示要插入的数据量
int index = 5000; //表示从哪个位置插入
long time = System.currentTimeMillis();
for (int i = 1; i < num; i++) {
list.add(index, i);
}
return System.currentTimeMillis() - time;
}
}
主要有两个因素决定他们的效率,插入的数据量和插入的位置。我们改变这两个因素来看看它们的插入效率。
我们分别在index=1000的位置、index=5000的位置和index=9000的位置插入10000条数据的运行时间如下:
在index=1000处插入数据:
array insert time:31
linked insert time:31
在index=5000处插入数据:
array insert time:15
linked insert time:141
在index=9000处插入数据:
array insert time:16
linked insert time:140
总结:
当数据量较小时,两者效率差不多,没有显著区别;当数据量较大时,大约在容量的1/10处开始,LinkedList的效率就开始没有ArrayList效率高了,特别到一半以及后半的位置插入时,LinkedList效率明显要低于ArrayList,而且数据量越大,越明显。