ArrayList 大揭秘:底层结构、方法与面试攻略

23年毕业半年被裁后,一个月斩获大厂offer,“跟着周哥走,offer手里有”。文末有周哥50+场面试总结出的必会面试题。

ArrayList是List的接口实现类之一。

底层数据结构

ArrayList 的底层数据结构是一个动态数组。当向 ArrayList 中添加元素时,如果当前数组已满,它会自动扩容(默认扩容为原来容量的 1.5 倍)以容纳新的元素。

优缺点

  • 优点

    • 随机访问元素速度快。通过索引可以快速获取指定位置的元素,时间复杂度为 O(1)。
    • 遍历方便。可以使用 for 循环、foreach 循环等方式进行遍历。
  • 缺点

    • 插入和删除元素效率较低。在中间位置插入或删除元素时,需要移动大量元素,时间复杂度为 O(n)。

常见方法

  • add(E element):在列表末尾添加指定元素。

  • add(int index, E element):在指定索引位置插入元素。

  • get(int index):返回指定索引位置的元素。

  • remove(int index):删除指定索引位置的元素。

  • remove(Object o):删除指定元素。

  • size():返回列表中元素的个数。

应用场景

  • 当需要频繁地随机访问元素,而较少进行插入和删除操作时,ArrayList 是一个很好的选择。

  • 例如存储一系列固定不变或较少变动的数据,如学生名单、商品列表等。

大厂面试题

1. ArrayList 和 LinkedList 的区别是什么?

答:

  • ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

  • 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

  • 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数组元素。

简言之,数组寻址容易,插入删除困难;链表,寻址困难,插入删除容易。

2. ArrayList和Vector的区别(不同点)?

答:

  • Vector是线程安全的,ArrayList不是线程安全的。

  • ArrayList在底层数组不够用是在原来的基础上扩展0.5倍,Vector是扩展1倍,ArrayList更节省内存空间。

  • 相较于ArrayList,Vector在方法前面都加了Sychronized关键字,来保证线程安全性。

说明:当执行synchronized修饰的方法前,系统会对该方法加一把锁,方法执行完成后释放锁,加锁和释放锁的这个过程,在系统中是有开销的,因此,在单线程的环境中,Vector效率要差很多。(多线程环境不允许用ArrayList,需要做处理)。

以上内容出自本人整理的面试秘籍。 链接: https://pan.baidu.com/s/1o014Ems8diV0D3h8K15olA?pwd=fi3x 提取码: fi3x 复制这段内容后打开百度网盘手机App,操作更方便哦

工作日每天更新,周末随缘更新。

请关注我,以便及时获取最新内容哦!

本文由 mdnice 多平台发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值