ArrayList和LinkedList源码探究

首先,ArrayList和LinkedList都是Java集合框架中List的子类,在面试过程中我们经常被问到这两个有什么不同?

最常见的回答无非是ArrayList查询比较快,增删改比较慢。而LinkedList查询比较慢,增删改比较快。大多数人都能答道这点,但是为什么两个都是list,但是一个查询快另一个查询慢呢?

  • ArrayList

    这就要从它的底层数据结构入手了,从源码可以看出,list的底层数据结构是一个EMPTY_ELEMENTDATA数组来存储ArrayList的值
    在这里插入图片描述
    而且从源码看得出来,数组的默认初始容量为10

在这里插入图片描述
只要拥有数据结构基础的小伙伴都应该知道数组是一块连续的内存空间,可以被随机访问,但是链表内存空间不一定连续,所以造成链表只能顺序访问。

ArrayList的增加和删除元素也就是对数组进行操作,增加的时候在数组中最后面的元素进行下标后移,删除或添加元素则把指定下标元素移除,后面元素向前或向后移动。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ArrayList新增数据时,如果增加数据后的值返回数组的当前容量。

去除一个数据,把后面的数据整体前移
在这里插入图片描述
ArrayList的扩容,首先获取elementData的长度,计算一个newCapacity为oldCapacity的1.5倍。再判断newCapacity和oldCapacity,MAX_ARRAY_SIZE的关系。
在这里插入图片描述

  • LinkedList
    从linkedlist的源码来看,我们知道linkedlist内部维护了一个双向链表,通过pre和next指针进行操作
    在这里插入图片描述
    而且从图中可以看出来,linkedlist的初始值为0,而且貌似没有扩容操作,因为链表可以利用不连续的内存,所以容量大小只内存相关。
    在这里插入图片描述
    linkedlist的add和remove
    在这里插入图片描述
    在这里插入图片描述
    add通过尾插法进行数据的插入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
remove的话首先从first节点遍历到要删除的节点,然后修改前一个指针的next节点指向被删节点的next节点。

以上就是对ArrayList的源码和LinkedList源码的一些比较啦,嘿嘿!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值