JDK 源码解析 —— 集合(一)数组 ArrayList
1. 概述
ArrayList ,基于 [] 数组实现的,支持自动扩容的动态数组。相比数组来说,因为其支持自动扩容的特性,成为我们日常开发中,最常用的集合类,没有之一。
在前些年,实习或初级工程师的面试,可能最爱问的就是 ArrayList 和 LinkedList 的区别与使用场景。不过貌似,现在问的已经不多了,因为现在信息非常发达,这种常规面试题已经无法区分能力了。当然即使如此,也不妨碍我们拿它开刀,毕竟是咱的“老朋友”。
2. 类图
ArrayList 实现的接口、继承的抽象类,如下图所示:类图
实现了 4 个接口,分别是:
-
java.util.List接口,提供数组的添加、删除、修改、迭代遍历等操作。 -
java.util.RandomAccess接口,表示 ArrayList 支持快速的随机访问。关于 RandomAccess 标记接口,我们这里先不展开,胖友可以自行阅读 《RandomAccess 这个空架子有何用?》 文章。
-
java.io.Serializable接口,表示 ArrayList 支持序列化的功能。关于 Serializable 标记接口,我们这里先不展开,胖友可以自行阅读 《Java 序列化与反序列化》 文章。
-
java.lang.Cloneable接口,表示 ArrayList 支持克隆。关于 Cloneable 标记接口,我们这里先不展开,胖友可以自行阅读 《在 Java 中为什么实现了 Cloneable 接口,就能调用 Object 的 clone 方法?》 讨论,特别是 R 大的回答。
继承了 java.util.AbstractList 抽象类,而 AbstractList 提供了 List 接口的骨架实现,大幅度的减少了实现迭代遍历相关操作的代码。可能这样表述有点抽象,胖友点到 java.util.AbstractList 抽象类中看看,例如说 #iterator()、#indexOf(Object o) 等方法。