ArrayList和LinkedList

一、ArrayList和LinkedList区别

  1. ArrayList和LinkedList都是实现了List接口,都不保证线程安全的
  2. ArrayList是使用的动态数组的数据结构,LinkedList使用的是双向链表的数据结构
  3. 一般来说LinkedList的空间占用要比ArrayList要大,因为LinkedList的每个元素都需要保存前后元素的位置以及数据,ArrayList元素数量如果到达临界值时需要扩容
  4. ArrayList因为使用数组,因此在随机访问的速度上要比LinkedList速度快
  5. LinkedList使用双向链表数据结构,但是在删除和新增的时候速度不一定要比ArrayList速度快(下面举例说明)

二、ArrayList和LinkedList对比

  1. 首先简单说明ArrayList和LinkedList的查询和插入逻辑:
    ArrayList:查询数据时,直接找到对应索引的值。插入数据时,若指定位置,则需要将该位置后所有元素向后移动,删除同理。
    LinkedList:查询数据时,若索引值小于索引数据量的1/2,则从头开始查找,若索引值大于索引数据量的1/2,则从尾开始查找。插入数据时,需要先找到对应位置,所以和ArrayList相比不一定谁快谁慢。
  2. 举例说明
    首先向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速度越快。

你可能感兴趣的:(Java学习,java)