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#干货预警!本人大厂在职程序员,根据自身面试经历整理,分享给大家。