简述ArrayList 和 LinkedList的异同点

目录

1.底层实现原理

2.两者都是实现了List接口的实现类

3.ArrayList 与 LinkedList的查询

3.1ArrayList:get()方法

3.2LinkedList:get() 方法 和 node() 方法

3.2.1特殊情况

4.ArrayList 与 LinkedList的添加

4.1ArrayList

4.2LinkedList

5.总结


1.底层实现原理

ArrayList:ArrayList的底层是动态数组,查询更简便。

LinkedList:LinkedList的底层是链表,添加与删除元素更方便。

2.两者都是实现了List接口的实现类

区别是:

ArrayList:ArrayList 继承 AbstractList 类,实现 List 等接口。

LinkedList:LinkedList 继承 AbstractSequentialList 类,实现 List 和 Deque 等接口,因此可以当队列使用。

3.ArrayList 与 LinkedList的查询

3.1ArrayList:get()方法

源码:

    /**
     * Returns the element at the specified position in this list.
     *
     * @param  index index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

案例:

3.2LinkedList:get() 方法 和 node() 方法

get()源码:

 

get()案例:

node()源码:

 

3.2.1特殊情况

LinkedList 在获取第一个元素和最后一个元素时很快

原因在于,LinkedList 内部有两个属性,分别是 first 和 last 。
这两个属性一直持续的记录着,底层链表里面的第一个元素的位置和最后一个元素的位置在哪里。

源码

所以 LinkedList 在查询第一个元素和最后一个元素时很快,因为不涉及遍历。

4.ArrayList 与 LinkedList的添加

4.1ArrayList

在最后的位置添加元素,不需要移动,需要扩容。

在指定的位置添加元素,指定位置的元素及后面的元素,均往后移动;效率相对较慢。(因为指定了位置,所以不用去遍历查找,但是需要移动元素)

源码:

4.2LinkedList

LinkedList 的添加操作不涉及扩容

在最后的位置添加元素。

源码:

在指定的位置添加元素,需要遍历找到下标,但是插入很快。

5.总结

以下情况使用ArrayList

  • 频繁访问列表中的某一个元素。
  • 只需要在列表末尾进行添加和删除元素操作。

以下情况使用LinkedList​​​​​​​​​​​​​​

  • 你需要通过循环迭代来访问列表中的某些元素。
  • 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值