ArrayList和LinkedList区别
这是一道比较经典的面试题
主要不同点:
- 数据结构不同
- 效率不同
- 空间灵活性和占用内存不同
注意点: - 在新建ArrayList的时候最好指定初始化大小,防止频繁扩容影响效率
- 在jdk1.7中ArrayList默认初始化大小为10,每次扩容0.5(1.5倍)【饿汉式】
- 在jdk1.8中ArrayList默认为空数组,第一次add的时候会设置为10,如果满了再自动扩容【懒汉式】
1.LinkedList实现了Deque接口,可以作为双端队列使用
2.因为数据结构不同,ArrayList是数组结构,LinkedList是双向链表结构
- ArrayList指定下标查询的时候有优势,因为数组是提前分配好内存空间的
- LinkedList指定下标(get)查询时候需要去遍历这个链表,才能找到指定下标位置
当Linkedlist获取第一个元素(getFirst)和最后一个元素(getLast)的速度也是非常快的
原因:在LinkedList中有两个属性,first和last它俩会一直持续记录着第一个元素和最后一个元素的位置(不会涉及到遍历操作)3.由于底层数据结构不同,ArrayList更适合随机查找,LinkedList更适合删除和添加
- 当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。ArrayList对于数据查询非常快,但是插入与删除元素比较慢
- 当对数据进行增加和删除的操作(add和remove操作)时,LinkedList是恰好相反的,它的查询速度非常慢,但是插入与删除元素的速度非常快。
- ArrayList进行新增Add操作的时候,会把当前待插入元素添加到最后的一个位置
- 如果不需要进行扩容是非常快速的,如果需要扩容会有扩容成本
- 如果数组指定的位置有元素了,则会把指定元素后的元素挨个往后移动,会导致效率低
arraylist.add(1,1); - LinkedList进行新增Add操作的时候,只需要遍历找到对应下标,然后替换对应元素的next和prev的操作
- LinkedList没有扩容操作,因为是链表结构,只需要指定下一个节点
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 喵喵鱼塘!





