您的位置:首页 > 其它

ArrayList 和 LinkedList 源码分析

2017-02-22 14:22 471 查看
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在中间元素前边的时候,从头到尾查找,反之则从尾到头查找。

这样对于查找效率有一定优化作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: