Java基础-List集合系列

全文使用JDK11

本篇目录

  1. List接口的继承关系

  2. ArrayList继承关系

  3. ArrayList底层数据结构

  4. LinkedList继承关系

  5. LinkedList底层数据结构

  6. Vector集合

List接口子类

可以看到有74个不同的类和接口实现了List这个接口,如果每一个都要学习的话,会很乏力。

更好的方法是学习我们常用的,以后有更多的时间再去慢慢拓展。

List接口的继承关系

List继承关系

由它的继承关系可以看到List接口继承至Collection接口,所以Collection中有的方法,List也继承过来了。

ArrayList

ArrayList继承关系

毋庸置疑ArrayList集合是我们最常使用的集合之一,是List接口的一个实现类。

ArrayList继承关系

Cloneable是一个标记接口,只有实现这个接口后,然后在类中重写clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常。

AbstractList是一个抽象类,它也实现了List接口。那为什么ArrayList继承它,而不是直接去实现List接口呢?这是因为List的实现类太多了,为了减少这些类的重复代码,所以将它们写成一个抽象类。各位在开发过程中也可以用一下这个思想。

RandomAccess也是一个标记接口,只有实现这个接口后,就能支持快速随机访问。往上追溯,可以在Collections接口中的binarySearch()方法中会判断当前的List是否实现了RandomAccess接口,然后再决定使用for循环的还是使用迭代器的形式遍历当前List

Serializable也是一个标记接口,只有实现了这个接口后,这个类才能进行序列化。

ArrayList底层数据结构
transient Object[] elementData;

从它的源码中可以看到底层是Object[],所以它可以存储几乎所有类型的数据。transient关键字的作用是在序列化这个对象时,这个属性不会被序列化。

如果对ArrayList感兴趣可以查看我另一篇对ArrayList的详解,这篇文章的重心在介绍List集合。

ArrayList集合深度解析及其使用优化

LinkedList

LinkedList继承关系

LinkedList继承关系

CloneableSerializable上面介绍ArrayList的时候说过了,这里就不提了。

AbstractSequentialList抽象类继承至AbstractList抽象类,而在上面有介绍后者,它俩的区别在前者只支持按次序访问,后者支持随机访问。这就是为什么LinkedList集合没有实现RandomAccess接口,因为它不支持随机访问。

Deque接口定义了一个双端队列,它提供了一系列针对队列首尾元素的操作方法。而LinkedList实现了该接口,意味着它可以做为一个双端队列来使用。

LinkedList底层数据结构
private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

LinkedList本质上是一个双向链表,item存储着本身的元素,next指向下一个Nodeprev指向上一个Node。如下图:

image.png

Vector

image.png

可以从Vector的继承关系中看出,它与ArrayList应该比较相似。

VectorArrayList的底层数据结构、初始容量、扩容方式等都差不多。

不同的地方是Vector相对来说是线程安全的,因为它的大多方法都使用synchronized关键字,如果开发者对线程安全有更高的要求,推荐使用Vector

对于Vector的详解,后面我会专门写一篇来介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值