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

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,需要做处理)。

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

#软件开发2024笔面经##秋招##软件开发笔面经##java#
Java 高频面试题 文章被收录于专栏

干货预警!本人大厂在职程序员,根据自身面试经历整理,分享给大家。

全部评论

相关推荐

10-07 20:48
门头沟学院 Java
不敢追175女神:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务