ArrayList和LinkedList区别

这是一道比较经典的面试题
主要不同点:
● 数据结构不同
● 效率不同
● 空间灵活性和占用内存不同
注意点:
● 在新建ArrayList的时候最好指定初始化大小,防止频繁扩容影响效率
● 在jdk1.7中ArrayList默认初始化大小为10,每次扩容0.5(1.5倍)【饿汉式】
● 在jdk1.8中ArrayList默认为空数组,第一次add的时候会设置为10,如果满了再自动扩容【懒汉式】
ArrayList和LinkedList区别_第1张图片

1.LinkedList实现了Deque接口,可以作为双端队列使用
ArrayList和LinkedList区别_第2张图片

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和LinkedList区别_第3张图片

○ 如果不需要进行扩容是非常快速的,如果需要扩容会有扩容成本
ArrayList和LinkedList区别_第4张图片

○ 如果数组指定的位置有元素了,则会把指定元素后的元素挨个往后移动,会导致效率低
arraylist.add(1,1);
● LinkedList进行新增Add操作的时候,只需要遍历找到对应下标,然后替换对应元素的next和prev的操作
ArrayList和LinkedList区别_第5张图片

○ LinkedList没有扩容操作,因为是链表结构,只需要指定下一个节点

你可能感兴趣的:(java,java)