下面从源码角度进一步分析这两种list的具体差异:
ArrayList:
LinkedList:
可以看到ArrayList直接继承了AbstractList, 同时,也实现了List接口。但是,LinkedList既实现了List接口,同时还实现了Deque接口,这就使得LinkedList能够实现一些 (双端队列) 的操作。
查询的对比:
ArrayList: 可以通过ArrayList.get( index) 方法去查询对象,由于它的底层是基于数组实现的,所以在根据下标去进行查询时速度非常快。
LinkedList: 同样可以通过get()方法去查询,但是由于它的底层是根据链表实现的,链表在查询元素过程中必须先对整个链表进行遍历才可以获得指定的对象,因此查询非常耗时。但是,LinkedList在查询头尾节点时非常快,可以通过getFirst()和getLast()方法得到,主要原因是LinkedList的底层始终有两个节点first和last去记录着这两个元素的位置。
总结:如果是根据下标进行查询,那么ArrayList 的查询速度是要快于LinkedList的。
添加的对比:
ArrayList 在添加元素时,通过add()方法来操作,
- 如果不指定下标,就直接添加到末尾,相当于扩容操作。
- 而如果是指定下标的话,就会放入指定位置。另外,如果待插入位置已有元素存在,则后面的元素会相应的后移,操作时间会相应变长。
LinkedList在添加元素时,同样可以使用add()方法。
- 如果不指定下标同样也会将元素添加到链表的末尾。
- 如果是指定下标的话,就需要遍历整个链表,然后找到对应的那个下标,整个操作的时间和下标位置的大小有关,下标大,时间长,下标小,时间短。
总结:在进行插入/添加操作时,两者的性能无法量化比较。如果不在意性能,ArrayList更适合内容已经初始化好的场景。而LinkedList则更适合需要频繁进行插入操作的场景。