(涉及代码均是JDK1.8版本下的源码。)
首先看下ArrayList。
- ArrayList继承了List接口,
- 底层是数组实现,所以查询指定下标的数据时,效率很好
3. 添加数据时,默认是直接插入到最后,效率也很快,
4. 如果插入到指定位置,效率就要跟插入位置之后的数据量有关了,因为涉及到数据的平移复制,其实直接插入数据也不一定效率就高,
此外还要看是否需要扩容,如果需要扩容,也会降低操作效率
接下来再看LinkedList。
- LinkedList继承了List和Deque接口,
- 由于实现了Deque接口,所以可以作为双端队列
- 底层是链表结构,遍历越靠后的数据花费时间越长,但是,由于底层实现了getFirst()和getLast(),所以链表的头结点和尾节点是一直有记录的,获取链表的第一个元素和最后一个元素可直接调用相应的方法,从而提高获取效率。
4. LinkedList的新增元素默认也是插入到链表尾部,代码如下:
所以默认插入的效率还是很高的。其实LinkedList指定位置插入元素也很快,因为链表的插入操作会先判断是否是尾节点,是就直接插入到尾部,如果不是就遍历到指定位置然后插入元素即可,时间多花费在遍历上
所以不能单纯的说谁的效率更高,谁更适合增删改,谁更适合查询,要结合具体情况而定。只能说多数情况下,ArrayList更合适随机查找,LinkedList更适合频繁的删除和新增操作,至于时间复杂度每种操作和情况下各有不同。