Java教程

Java基础-List集合系列

本文主要是介绍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的详解,后面我会专门写一篇来介绍。

这篇关于Java基础-List集合系列的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!