Java基础疑点解析 谈谈LinkedList与ArrayList

1,底层数据结构的差异
ArrayList,数组,连续一块内存空间
LinkedList,双向链表,不是连续的内存空间

2、一个常规的结论
虽然不严谨,但也可以应付很多面试了
ArrayList,查找快,因为是连续的内存空间,方便寻址,但删除,插入慢,因为需要发生数据迁移

LinkedList,查找慢,因为需要通过指针一个个寻找,但删除,插入块,因为只要改变前后节点的指针指向即可。

如果严谨来看,假设有数组[a,c,b,d]
对于查找来讲:
1、如果查找第2个元素b(定位查找),因为ArrayList是连续的内存空间,通过计算偏移量,可以很快查询找到第二个元素,而LinkedList不连续,无法计算,只能沿指针(引用地址值)一个个往下找,所以效率ArrayList > LinkedList
2、如果查找b在哪,不管是ArrayList还是LinkedList,都只能通过遍历的方式,效率半斤八两。

对于插入来讲:
1、如果在中间位置插入,效率 LinkedList > ArrayList。
2、对于末尾插入,ArrayList直接加在后面就行,而对于LinkedList ,因为它底层有两个指针,一个指向头部,一个指向尾部,所以两者效率半斤八两。

3,ArrayList细节分析
1,增加
添加到末尾,正常不需要做特别的处理,除非现有的数组空间不够了,需要扩容
数组初始化容量多大?10,当你知道需要存储多少数据时,建议在创建的时候,直接设置初始化大小
怎么扩容?
当发现容量不够之后,就进行扩容
按原先数组容量的1.5倍进行扩容,位运算,下面是关键的源码
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
再将原先数组的元素复制到新数组,Arrays
elementData = Arrays.copyOf(elementData, newCapacity)
添加到其他位置,这个时候需要做整体的搬迁
2,删除
删除末尾,并不需要迁移
删除其他的位置,这个时候也需要搬迁
3,修改
修改之前,必须先定位
定位-查找-ArrayList(数组是一段连续的内存空间,定位会特别快)
4,查找
如上所述

4,LinkedList细节分析

1,提供了的两个引用(first,last)

2,增加

添加到末尾,创建一个新的节点,将之前的last节点设置为新节点的pre,新节点设置为last

我们看下源码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值