Java集合—List—继承关系

2.jpg

前言

集合类库Collection中最常用的大概就是ArrayList了,List a = new ArrayList();也是很常见了~那么ArrayList和List究竟是什么关系?为什么要用如:List a = new ArrayList(); 这种方式创建新的ArrayList对象呢?这是几乎每个Java新人都会遇到的问题。本文不去讨论ArrayList的常见用法,而是重点看一下ArrayList的继承关系,它继承了哪些类?实现了什么接口?


首先,来看一下ArrayList:

List是一个接口,ArrayList是实现了List接口的实现类。那让我们来看一下源码中ArrayList的定义吧!(Java8)

public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable{...}

可以看见ArrayList继承了AbstractList,实现了List、RandomAccess、Cloneable、Serializabl接口。所以现在,第一个问题就解决了:List是个接口,ArrayList实现了这个接口,这就是他们的关系,第二个问题先不讨论,留到以后。让我们先看一下ArrayList继承的抽象类AbstractList,和实现的其他几个接口吧!

AbstractList是一个抽象类,定义如下:

public abstract class AbstractList extends AbstractCollection implements List {...}

可见AbstractList继承自AbstractCollection,并实现了List接口。好,现在清楚多了,让我们看看AbstractCollection是个什么东西?看名字就很直观,是Collection的抽象类,点进去源码里看看是不是?

public abstract class AbstractCollection implements Collection {

很明显,AbstractCollection果然是个抽象类,实现了Collection接口。现在所有的关系都分析出来了,但是不直观,一图胜千言,让我们看图说话:

image

1.ArrayList继承了抽象类AbstractList,同时实现了List、RandomAccess、Cloneable、Serializable接口。

2.抽象类AbstractList继承自抽象类AbstractCollection同时实现了List接口。

3.抽象类AbstractCollection实现了Collection接口

4.List接口继承自Collection接口

5.Collection接口继承自Iterable接口


ArrayList说完,再看一下LinkedList:

这次,就直接看图说话了:

image

1.LinkedList继承自抽象类:AbstractSequentialList,同时实现了List、Cloneable、Serializable、Deque接口。

2.抽象类AbstractSequentialList继承自抽象类AbstractList

3.抽象类AbstractList继承自抽象类AbstractCollection同时实现了List接口。

4.抽象类AbstractCollection实现了Collection接口

5.Deque接口继承自Queue接口,Queue接口继承自Collection接口

6.Collection接口继承自Iterable接口

对比ArrayList发现:

1.LinkedList并没有实现RandomAccess接口,因为一个类实现了RandomAccess接口则表示支持快速随机存取(时间复杂度为O(1)),而LinkedList底层是链表,要访问某个数只能通过依次遍历的方式(时间复杂度O(n)),所以LinkedList是没有实现RandomAccess接口的。

2.LinkedList实现了Deque接口,Deque继承自Queue,Double ended queue (双端队列) 的缩写,表明LinkedList可以实现双端队列所支持的如头部尾部插入删除访问元素等功能。

你可能感兴趣的:(Java集合—List—继承关系)