ArrayList和LinkedList区别(源码分析)

面试题中经常出现的一道题就是ArrayList和LinkedList的区别话不多说我们下面一个个来看看

ArrayList:

1)继承AbstractList抽象类默认长度是10其中维护的是一个数组

其中size变量为当前维护的数组的长度elementData是当前维护的集合数据

2)添加元素的方法有

add(E e)、add(int index, E e)、addAll(Collection<? extends E> c)、addAll(int index, Collection<? extends E> c)

add(int index,E e)是没有返回值的。剩下都有返回值

添加的过程为:

a.add(E e)方法分为两步第一步是修改数据长度以及是否要扩容第二步为size自增第三步为将数据存入最后一个位置

其中第一步内部还包括了modCount自增的操作。该变量为其父类AbstractList定义的意义是集合修改次数

ensureCapacityInternal()方法有兴趣的人可以跟进去研究一下里面还是比较简单的

b.add(int index,E e)方法

第一步判断index是否合法(index必须为0~size)否则抛出越界异常

第二步和add(E e)一样

第三步是将index下标以及之后的数据往后移动一个位置

第四步将数据放到index下标位置

第四步size自增add(E e)方法中是先自增

c.addAll(E e)同add(E e)多一个arrayCopy步骤

d.addAll(int index,E e)同add(int index,E e)多一个arrayCopy步骤

3)get方法

第一步判断下标是否合法

第二步通过修改次数判断是否正在操作

第三步直接通过下标找到数组中的元素返回

LinkedList:

1)继承的类以及实现的接口如图。没有默认长度只有当前长度维护的是一个双向链表链表中里面存放的是自定义的Node<E>对象。其中Node对象当中存放的是该节点的数据E item 、上一个Node节点的指向以及下一个节点的指向如图

Node对象:

添加对象的方式

addFirst(E e)

addLast(E e)

add(E e):

第一步创建Node对象其中将最后一个元素的指向作为Node的prev数据作为Node的数据

第二步当前长度自增、修改次数自增

add(int index,E e)

第一步判断是否合法index

第二步找到index位置的Node对象判断是调用linkLast还是linkBefore方法

第三步创建Node对象插入

get方法

第一步判断下标是否合法

第二步找到index位置的Node节点对象

getFirst() getLast()

综上所得

定义:实现的接口和继承的父类不同

基本属性:ArrayList 包括数组对象、长度、修改次数i

               LinkedList包括长度、修改次数、Node节点对象

添加操作:

      1)往最后一个位置添加操作对比:

      LinkedList需要创建Node节点对象ArrayList不需要速度上在插入数量多的情况LinkedList会稍快一些

      2)往指定位置

      ArrayList只有add(int index)其中包括扩容以及复制数组的操作

      LinkedList包括往第一个插入以及指定位置插入其中涉及到了遍历node节点对象的操作相对ArrayList而言快

查询操作(根据下标进行查找):

     ArrayList直接根据下标可直接得到对象

    LinkedList需要先遍历node节点获得指定下标的Node对象(查找第一个不需要遍历Node对象)

    ArrayList快

    如果查找第一个对象两种没有比较过应该差不多快

纯手工制作希望大家能关注我。我会每一周都发表一篇文章

本人QQ/weChat  : 806751350

github地址https://github.com/linminlm

猜你喜欢

转载自blog.csdn.net/qq_32695789/article/details/83958084