【ArrayList、LinkedList使用get()方法获取元素时的效率对比,以及源码分析】

目录

  • 1.ArrayList使用get()方法的底层源码
    • 1.1ArrayList查找快的源码分析
  • 2. LinkedList使用get()方法的底层源码
    • 2.1LinkedList底层使用的是链表
    • 2.2LinkedList查找慢的源码分析
  • 3.ArrayList、LinkedList使用get()方法获取元素时的效率对比

1.ArrayList使用get()方法的底层源码

1.1ArrayList查找快的源码分析

注意:ArrayList底层使用的是数组

public class ArrayList {
     //集合的长度
     private int size;
     //ArrayList集合存储元素的那个数组
     private Object[] elementData;

    //ArrayList根据索引获取元素的方法
    //参数index:每次调用get方法传递的 索引
    public E get(int index) {
        rangeCheck(index);
        //取出元素的方法
        return elementData(index);
    }

    //取出数据的方法
    Object elementData(int index) {
        //没有循环遍历,直接使用数组名+索引的方式 快速取出元素
        return elementData[index];
    }

    //校验索引是否越界
    private void rangeCheck(int index) {
        //如果索引大于等于集合的长度,那么就制造一个索引越界的异常
        if (index >= size)
            throw new IndexOutOfBoundsException(index);
    }
}

2. LinkedList使用get()方法的底层源码

2.1LinkedList底层使用的是链表

注意:LinkedList底层使用的是链表
链表结构的演示:

public class Test01 {
    public static void main(String[] args) {
        /**
         * 需求:简单的演示一下链表结构
         * 由一个个节点【对象,Node】组成
         */

        //创建一个节点对象,代表最后一个节点
        Node lastNode = new Node("平平无奇古天乐",null);
        //创建一个节点对象,代表第一个节点
        Node firstNode = new Node("悔创阿里杰克马",lastNode);
    }
}

【ArrayList、LinkedList使用get()方法获取元素时的效率对比,以及源码分析】_第1张图片

2.2LinkedList查找慢的源码分析

public class LinkedList {

    //LinkedList获取元素的方法
    public E get(int index) {
        //校验索引是否越界
        checkElementIndex(index);

        //node(index):获取链表上节点的方法
        //node.item: 获取的就是节点的内容
        return node(index).item;
    }

    //链表获取元素的方法
    Node node(int index) {
        //判断get方法的参数【索引】 是否小于 集合长度的 一半
        if (index < (size / 2)) {
            //如果小于一半,就从 第一个节点开始一个个的向后找
            Node x = first;
            for (int i = 0; i < index; i++)
                //循环一次,就将下一个节点的地址赋值给X
                x = x.next;
            return x;
        } else {
            //将最后一个节点赋值给X
            Node x = last;
            //从集合的最后一个节点向前找
            for (int i = size - 1; i > index; i--)
                //每次循环,将上一个节点赋值给x
                x = x.prev;
            return x;
        }
    }


    //判断索引是否越界
    private void checkElementIndex(int index) {
        if (! index >= 0 && index < size )
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }


}

3.ArrayList、LinkedList使用get()方法获取元素时的效率对比

package day06;

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

public class Test02 {
    public static void main(String[] args) {
        //创建一个ArrayList,添加10W个元素
        ArrayList arrayList = new ArrayList<>();
        //循环10W次
        for (int i = 0; i < 100000; i++) {
            //添加元素
            arrayList.add(i+"");
        }

        //创建一个LinkedList,添加10W个元素
        LinkedList linkedList = new LinkedList<>();
        //循环10W次
        for (int i = 0; i < 100000; i++) {
            //添加元素
            linkedList.add(i+"");
        }

        System.out.println("arrayList 和 linkedList 都存储了10W个元素");
        //对比一下,取出元素的速度
        //遍历arrayList,记录取出10W个元素用时多少
        //在循环之前先获取系统的毫秒值
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            //调用get方法获取元素
            arrayList.get(i); //在此处打一个断点,看源码
        }
        long endTime = System.currentTimeMillis();
        System.out.println("arrayList取出10W个元素用时:"+(endTime - startTime));
        System.out.println("---------------");

        //再次获取时间,且重新给 startTime 和 endTime赋值
        startTime = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); i++) {
            //调用get方法获取元素
            linkedList.get(i);//在此处打一个断点,看源码
        }
        endTime = System.currentTimeMillis();
        System.out.println("linkedList取出10W个元素用时:"+(endTime - startTime));
    }
}

你可能感兴趣的:(javaSE,链表,java)