阿里巴巴java性能调优实战:ArrayList还是LinkedList?使用不当性能差千倍

 

ArrayList还是LinkedList?使用不当性能差千倍

集合作为一种存储数据的容器,是我们日常开发中使用最频繁的对象类型之一。JDK 为开 发者提供了一系列的集合类型,这些集合类型使用不同的数据结构来实现。因此,不同的集 合类型,使用场景也不同。 很多同学在面试的时候,经常会被问到集合的相关问题,比较常见的有 ArrayList 和 LinkedList 的区别。 相信大部分同学都能回答上:“ArrayList 是基于数组实现,LinkedList 是基于链表实现。”

而在回答使用场景的时候,我发现大部分同学的答案是:“ArrayList 和 LinkedList 在新增、删除元素时,LinkedList 的效率要高于 ArrayList,而在遍历的时候,ArrayList 的效率 要高于 LinkedList。”这个回答是否准确呢?今天这一讲就带你验证。

 

初识 List 接口

在学习 List 集合类之前,我们先来通过这张图,看下 List 集合类的接口和类的实现关系:

阿里巴巴java性能调优实战:ArrayList还是LinkedList?使用不当性能差千倍_第1张图片

我们可以看到 ArrayList、Vector、LinkedList 集合类继承了 AbstractList 抽象类,而 AbstractList 实现了 List 接口,同时也继承了 AbstractCollection 抽象类。ArrayList、 Vector、LinkedList 又根据自我定位,分别实现了各自的功能。

ArrayList 和 Vector 使用了数组实现,这两者的实现原理差不多,LinkedList 使用了双向 链表实现。基础铺垫就到这里,接下来,我们就详细地分析下 ArrayList 和 LinkedList 的 源码实现。

ArrayList 是如何实现的?

ArrayList 很常用,先来几道测试题,自检下你对 ArrayList 的了解程度。

问题 1:我们在查看 ArrayList 的实现类源码时,你会发现对象数组 elementData 使用了 transient 修饰,我们知道 transient 关键字修饰该属性,则表示该属性不会被序列化,然 而我们并没有看到文档中说明 ArrayList 不能被序列化,这是为什么?

问题 2:我们在使用 ArrayList 进行新增、删除时,经常被提醒“使用 ArrayList 做新增删 除操作会影响效率”。那是不是 ArrayList 在大量新增元素的场景下效率就一定会变慢呢?

问题 3:如果让你使用 for 循环以及迭代循环遍历一个 ArrayList,你会使用哪种方式呢? 原因是什么? 如果你对这几道测试都没有一个全面的了解,那就跟我一起从数据结构、实现原理以及源码 角度重新认识下 ArrayList 吧。

 

1.ArrayList 实现类

ArrayList 实现了 List 接口,继承了 AbstractList 抽象类,底层是数组实现的,并且实现了自增扩容数组大小。

ArrayList 实现了 Cloneable 接口和 Serializable 接口,所以他可以实现克隆和序列化。

ArrayList 实现了 RandomAccess 接口。你可能对这个接口比较陌生,不知道具体的用处。通过代码我们可以发现,这个接口其实是一个空接口,什么也没有实现,那 ArrayList 为什么要去实现它呢?

其实 RandomAccess 接口是一个标志接口,他标志着“只要实现该接口的 List 类&

你可能感兴趣的:(链表,java,数据结构,编程语言,面试)