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 高频面试题 文章被收录于专栏

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

全部评论

相关推荐

08-14 13:54
已编辑
门头沟学院 Java
3月春招学校里摆摊递了张纸质简历,好像突然被捞安卓复活赛了。7.22一面:内容跟二面差不多,常规八股+手撕偷钱dp第二天约的二面。都是1h左右。7.29 二面:【闲聊】1. 经历又有前后端又有Android,以后规划怎么样?2. 神经网络轻量化(研究方向)?展开说说3. 能实习多久?论文发了吗?【开始拷打】1. Android会哪些?2. Activity生命周期3. Activity 启动模式4. Propoerties(?不会)5. Manifest文件了解过吗?都能干什么6. 用过哪些控件?7. 控件怎么在Activity绑定?(咱直接投降喵,坦白安卓不太会,上次做已经是一年多前了)8. 写安卓用的kotlin还是Java?平时写后端用java还是golang(回答说Java,然后开始拷打Java)9. 链表跟数组的区别?应用场景?10. 进程和线程的区别、通信方式12. 反射机制了解吗13. Java有哪几种注解14. 四大引用类型15. volatile和synchronized关键字区别16. 你刚刚说到线程安全,之前写后端的时候多线程用的多吗?17. 线程池核心参数18. HashMap和ConcurrentHashMap的区别19. 内部匿名类了解吗?(没自己写过,看源码经常看到,然后开始吟唱)20. 设计模式了解哪些?【手撕】线程安全的单例(设计模式说了单例),链表数字求和。面试官还挺好的,写错的地方会提醒。【闲聊again】1. 哪里人?以后在打算上海工作吗?2. 实习时间again3. 如果入职后觉得字节是你理想的公司,考虑转正吗?(我怎么敢想)4. 职业规划--------------------------------------------------------------7.31更新 约三面了,因为现在的实习单位有个难搞的需求,只能约到下周一了--------------------------------------------------------------8.5 更新,三面结束,感觉寄了。自我介绍、实习研究方向讲了快半小时,两个安卓场景题拷打了20min+(真不会安卓)【拷打】1. 自我介绍2. 介绍下实习工作(一开始说的有点乱,面试官让我组织下语言)3. 介绍下课题研究方向(从低秩分解,讲到蒸馏、剪枝、量化),模型轻量化现在很火吗,业界有什么有名的成果?(工业界不知道,讲了点学术的)4. 个人职业规划,现在的主要语言5. tensorflow lite和tensorflow有什么区别(俺是坚定的torch选手,把话题引向了pytorch和pytorch mobile)6. 什么是内存泄漏7. 场景题:客户端内存泄露怎么排查?(不会,寄)8. 场景题:移动端大文件上传怎么做?(只做过web客户端跟服务端的,讲了当时做的分片+消息队列)【手撕】两个字符串是不是相同的模式【反问】1. 有什么建议或评价:知识广度挺够,但安卓这块深度还不够2. 一些业务问题4. 什么时候出结果也没跟前两次问实习时间,感觉是寄了。--------------------------------------------------------------8.7 更新:约hr面了,许愿oc8.9 更新: hr面结束,二十多分钟,唠了些家常,主打真诚…给hr听楽了。1. 职业规划:(近一年)实习牛马—(近五年)深耕业务的正式牛马—(30多岁)失业当数字游民2. 喜欢怎样的工作模式:自由点的。3. 评价下自己,优缺点:一般牛马研究牲,学生角色常见属性。4. 本校考研还是保研:考的,决定考研已经快9月了,考本校图个稳。5. 之前也在准备工作吗:之前在不务正业,不怎么上心这些。6. 不务正业是具体做什么:爱好相关(回顾黑历史)7. 课题怎么定的:没钱做aigc大模型热点,找了个比较省钱的8. 学业上进展如何?实习多久反问:1. 一般工作时间2. 面试邮件好像岗位名字变了(还是实习,hr强调了下能转正)3. 实习工资8.14 晚上offer,当天leader恰v语音画饼,说ios缺人,让我考虑下。问了下那边android也是kotlin,都是重新开始,最后还是服从组织安排,然后加了mentor,开始学swift咯,希望能转正
查看67道真题和解析
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务