面试题10-ArrayList-LinkedList
ArrayList
- 基于动态数组,连续内存存储,适合下标访问(随机访问)
- 扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组。
- 不使用尾插:还会涉及到元素的移动
- 使用尾插:并且指定初始内容可以极大提高性能,甚至超过linkedList(因为LinkedList需要创建node对象)
LinkedList
- 基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询,需要逐一遍历。
- 缺点:遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。
区别
-
ArrayList 与 LinkedList 都是 List 接口的实现类,因此都实现了 List 的所有未实现的方法,只是实现的方式有所不同。
-
ArrayList 是基于动态数组数据结构的实现,访问元素速度优于 LinkedList。LinkedList 是基于链表数据结构的实现,占用的内存空间比较大,但在批量插入或删除数据时优于 ArrayList。
-
对于快速访问对象的需求,使用 ArrayList 实现执行效率上会比较好。需要频繁向集合中插入和删除元素时,使用 LinkedList 类比 ArrayList 类效果高。