区别
ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
对于随机访问,ArrayList优于LinkedList
对于插入和删除操作,LinkedList优于ArrayList
LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
在时间复杂度上的区别
假设我们有两个很大的列表,它们里面的元素已经排好序了,这两个列表分别是ArrayList类型和LinkedList类型的,现在我们对这两个列表来进行二分查找(binary search),比较它们的查找速度。
1 | 1 package com.demo; |
运行结果
1 | ArrayList访问消耗的时间:10 |
可以看出,对于随机访问,ArrayList的访问速度更快。
ArrayList和LinkedList的插入数据耗时:
1 | 1 package com.demo; |
运行结果:
1 | ArrayList插入消耗的时间:31 |
可以看出,对于插入操作,LinkedList 的速度更快
在空间复杂度上的区别
在LinkedList中有一个私有的内部类,定义如下:
1 | private static class Entry { |
LinkedList中的每一个元素中还存储了它的前一个元素的索引和后一个元素的索引。
ArrayList使用一个内置的数组来存储元素,这个数组的起始容量是10,当数组需要增长时,新的容量按如下公式获得:新容量 = 旧容量*1.5 + 1,也就是说每一次容量大概会增长50%
总结
ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
对于随机访问,ArrayList优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问。而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)
对于插入和删除操作,LinkedList优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。