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在中间元素前边的时候,从头到尾查找,反之则从尾到头查找。
这样对于查找效率有一定优化作用。