一、ArrayList和LinkedList区别
- ArrayList和LinkedList都是实现了List接口,都不保证线程安全的
- ArrayList是使用的动态数组的数据结构,LinkedList使用的是双向链表的数据结构
- 一般来说LinkedList的空间占用要比ArrayList要大,因为LinkedList的每个元素都需要保存前后元素的位置以及数据,ArrayList元素数量如果到达临界值时需要扩容
- ArrayList因为使用数组,因此在随机访问的速度上要比LinkedList速度快
- LinkedList使用双向链表数据结构,但是在删除和新增的时候速度不一定要比ArrayList速度快(下面举例说明)
二、ArrayList和LinkedList对比
- 首先简单说明ArrayList和LinkedList的查询和插入逻辑:
ArrayList:查询数据时,直接找到对应索引的值。插入数据时,若指定位置,则需要将该位置后所有元素向后移动,删除同理。
LinkedList:查询数据时,若索引值小于索引数据量的1/2,则从头开始查找,若索引值大于索引数据量的1/2,则从尾开始查找。插入数据时,需要先找到对应位置,所以和ArrayList相比不一定谁快谁慢。 - 举例说明
首先向ArrayList和LinkedList各插入100000数据,之后进行查询和插入,比较时间。查询的结果毋庸置疑,展示看看就好。需要多次对比插入的数据量及插入位置。
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* ArrayList和LinkedList查询和插入时间
*/
public class ListTest {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
LinkedList<Integer> linkedList = new LinkedList<Integer>();
//插入十万数据
for (int i = 0; i < 100000; i++) {
arrayList.add(i);
linkedList.add(i);
}
//记录时间
//System.out.println("array查询时间:"+gettime(arrayList));
//System.out.println("linked查询时间:"+gettime(linkedList));
System.out.println("array插入时间:"+inserttime(arrayList));
System.out.println("linked插入时间:"+inserttime(linkedList));
}
//插入数据
private static long inserttime(List<Integer> list) {
long number = 10000;//插入的数据量 10000 50000 80000
int index = 10000;//从哪里开始插入 100 1000 10000
long time = System.currentTimeMillis();
for (int i = 0; i < number; i++) {
list.add(index,i);
}
return System.currentTimeMillis()-time;
}
//查询数据
public static long gettime(List<Integer> list){
long time = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
//根据索引值找到对应索引
int search = Collections.binarySearch(list, list.get(i));
if (search!=i){
System.out.println("索引值错误!");
}
}
return System.currentTimeMillis()-time;
}
}
下面为多次测试的输出结果
--在100位置插入10000条数据
array查询时间:16
linked查询时间:27901
array插入时间:129
linked插入时间:2
--在1000位置插入10000条数据
array查询时间:13
linked查询时间:28892
array插入时间:145
linked插入时间:17
--在10000位置插入10000条数据
array查询时间:19
linked查询时间:30404
array插入时间:116
linked插入时间:175
--在50000位置插入10000条数据
array查询时间:18
linked查询时间:27936
array插入时间:55
linked插入时间:857
--在50000位置插入100条数据
array查询时间:16
linked查询时间:28612
array插入时间:3
linked插入时间:9
--在50000位置插入1000条数据
array查询时间:14
linked查询时间:28853
array插入时间:12
linked插入时间:88
因此可以看出,ArrayList和LinkedList的插入速度和数据量及插入位置有关。1. 在插入小数据量时差异不大,但是插入数据量变大时,LinkedList速度会逐渐比ArrayList慢。
2. 若插入位置在中间则LinkedList会达到最慢,越靠近边缘位置LinkedList速度越快。