ArrayList 和 LinkedList 源码分析

ArrayList 和 LinkedList 是java集合框架中 List 的实现类。

从数据结构上看,ArrayList 是通过数组存储数据,LinkedList 是一个双向链表。

下面具体分析一下其中比较重要的几个方法

一、ArrayList

  ArrayList 的数据全部存储在这个数组中。 

  1、add(E e)

  在添加元素时,会首先判断是否需要扩容,如果需要,按一定的算法进行扩容,不需要,直接将要添加的元素添加到最后。

  扩容的源代码如下:

  

  先把容积扩展到原容积+原容积/2,如果不够,直接设置为minCapacity(关于这个数值究竟是多少,可以跟踪一下源码),如果这个值大于 MAX_ARRAY_SIZE,则会将容积设置为Integer.MAX_VALUE。

  然后使用新容积创建新数组。

  2、add(int index, E element)

  这个方法就是插入。帖一下源码

  可以看到,同样先确认容积是否足够,之后把下标为index和index之后的数据后移一个位置,然后把新元素插入。

二、LinkedList

先帖一下关键代码

  LinkedList是一个双向链表,每个结点都有一个指向前一个及后一个结点的引用

  1、add(int index, E element)  插入方法

  

  因为是链式存储,所以不用考虑扩容的情况

  2、node(int index)   查找第 index 个结点

  

  因为是双向链表,所以可以从头到尾查找,也可以从尾到头查找。当index小于 size/2,也就是说,当index在中间元素前边的时候,从头到尾查找,反之则从尾到头查找。

  这样对于查找效率有一定优化作用。

原文地址:https://www.cnblogs.com/yinkh/p/6428759.html