底层数据结构
ArrayList 底层是一个类似动态数组的结构。
LinkedList 底层是一个双向链表(JDK1.6之前是循环的,JDK1.7之后取消了循环)。
由于数据结构的不同,ArrayList可以支持随机访问,而LinkedList不行。
时间复杂度
ArrayList 底层是类似动态数组的结构,支持随机访问所以访问某个数据的时间复杂度始终是1,但是由于底层结构是数组所以它的插入和删除受位置的影响。如果是在数组的尾部插入删除数据 它的时间复杂度是 1 但是如果指定是在i处 那么它的时间复杂度为 (n-i)。这是因为删除 i 位置的数据时,我们需要将i后的(n - i)位数据都向前移一位,而添加数据时,我们需要将 后 (n - i)位数据向后移一位。
LinkedList 的底层是一个双向链表,所以在它的头尾去插入数据时,它的时间复杂度始终是1,但是如果我们要求在i 位置进行删除和添加,那么我们的时间复杂度还是会接近 n 。这是因为我们需要移动寻找到我们需要的位置。
内存空间
ArrayList在内存空间上的空间浪费主要是由于我们需要多开一些空闲的空间以保证不会因为内存不够而造成溢出现象,并且由于ArrayList底层是数组,它的内存要求必须是连续的,所以如果是在内存分配不规整的机器中,那么它就有可能会分配不到足够的内存(当然这个是笔者的个人意见)。
LinkedList 由于底层结构是链表 所以我们不需要开一些多余的空间,但是它的单元的空间占内存要比ArrayList要大,毕竟我们需要存储下一个和上一个节点的地址,不过在我看来这也不是什么大问题,因为它的分散式的分布可以无视机器内存是否规整,只要内存满足一个单元的所需就行。