ArrayList数组和LinkedList双向链表效率问题的比较--两个方面:访问元素和插入元素

ArrayList数组 物理结构连续,并且有自己的下标,因而访问起来效率高,但也因其物理结构连续,插入元素时插入位置后的元素都要后移一位,删除同理,故而添加/删除元素的效率不高

LinkedList双向链表,列表中的每个节点都包含了对前一个和后一个元素的引用.访问效率低于ArrayList数组,但添加/删除元素只需要改变前后两个节点,故添加/删除元素的效率高于ArrayList数组.
—补充:LinkedList双向链表的特点是端口和尾端都能进能出,所以从端口和尾端无论是访问还是添加/删除,效率都比从中间开始的高

总结:查询用ArrayList,添加/删除用LinkedList

代码验证:

import java.util.ArrayList;
import java.util.LinkedList;

public class Num1ArrayVSLinked {
    public static void main(String[] args) {
        //ArrayList数组和LinkedList双向链表效率问题的比较--两个方面:取元素,插入元素
        //1.取元素
        ArrayList<String> arr = new ArrayList<>();
        LinkedList<String> lin = new LinkedList<>();
        for (int i = 0; i < 10000000; i++) {
            arr.add(i, "");
            lin.add(i, "");
        }
        //1.1 从列表的头部开始访问
        long time1 = System.currentTimeMillis();
        arr.get(10);
        long time2 = System.currentTimeMillis();
        System.out.println("ArrayList从列表的头部开始访问的时间:" + (time2 - time1));//0
        long time3 = System.currentTimeMillis();
        lin.get(10);
        long time4 = System.currentTimeMillis();
        System.out.println("LinkedList从列表的头部开始访问的时间:" + (time4 - time3));//0
        //1.2 从列表的中间开始访问
        long time5 = System.currentTimeMillis();
        arr.get(5000000);
        long time6 = System.currentTimeMillis();
        System.out.println("ArrayList从列表的中间开始访问的时间:" + (time6 - time5));//0
        long time7 = System.currentTimeMillis();
        lin.get(5000000);
        long time8 = System.currentTimeMillis();
        System.out.println("LinkedList从列表的中间开始访问的时间:" + (time8 - time7));//31
        //1.3 从列表的尾部开始访问
        long time9 = System.currentTimeMillis();
        arr.get(9999999);
        long time10 = System.currentTimeMillis();
        System.out.println("ArrayList从列表的尾部开始访问的时间:" + (time10 - time9));//0
        long time11 = System.currentTimeMillis();
        lin.get(9999999);
        long time12 = System.currentTimeMillis();
        System.out.println("LinkedList从列表的尾部开始访问的时间:" + (time12 - time11));//0

        //2.插入元素
        //2.1 从列表的头部开始插入
        long time01 = System.currentTimeMillis();
        arr.add(10,"3");
        long time02 = System.currentTimeMillis();
        System.out.println("ArrayList从列表的头部开始插入的时间:" + (time02 - time01));//547
        long time03 = System.currentTimeMillis();
        lin.add(10,"3");
        long time04 = System.currentTimeMillis();
        System.out.println("LinkedList从列表的头部开始插入的时间:" + (time04 - time03));//0
        //2.2 从列表的中间开始插入
        long time05 = System.currentTimeMillis();
        arr.add(5000000,"3");
        long time06 = System.currentTimeMillis();
        System.out.println("ArrayList从列表的中间开始插入的时间:" + (time06 - time05));//46
        long time07 = System.currentTimeMillis();
        lin.add(5000000,"3");
        long time08 = System.currentTimeMillis();
        System.out.println("LinkedList从列表的中间开始插入的时间:" + (time08 - time07));//47
        //2.3 从列表的尾部开始插入
        long time09 = System.currentTimeMillis();
        arr.add(9999999,"3");
        long time010 = System.currentTimeMillis();
        System.out.println("ArrayList从列表的尾部开始插入的时间:" + (time010 - time09));//0
        long time011 = System.currentTimeMillis();
        lin.add(9999999,"3");
        long time012 = System.currentTimeMillis();
        System.out.println("LinkedList从列表的尾部开始插入的时间:" + (time012 - time011));//0
    }
}

猜你喜欢

转载自blog.csdn.net/Llyon/article/details/107609796