1.ArrayList和LinkedList都实现了List接口,另外LinkedList还实现了Deque接口,见名知意,前者底层是数组,后者底层是链表。(对应的类图如下)
2.ArrayList的底层数组默认容量是10,传参的话按传的参数大小指定其容量。
LinkedList的底层是链表,并且有一个指向头和尾的指针。
3.#查找get(int index)方法
由于ArrayList底层是数组,所以直接返回数组对应的下标值就可,而LinedList底层是链表则需要从头遍历找到那个index,然后返回其值。由于LinkedList底层链表中有指向头和尾的指针,所以LinkedList中获取头部元素和尾部元素时间复杂度为O(1)
so:
对于这种指定下标的查询,ArrayList明显快与LinkedList!
4.#add(Object e)方法
ArrayList直接在底层数组尾部添加即可(有扩容操作).
LinedList在new一个新节点链表尾部添加.
5.#add(int index,Object e)
ArrarList如果要在指定位置添加元素,如果该位置已经有了元素,就涉及到数组的移动,相对而言效率很低.
LinkedList如果要在指定位置添加元素,需要遍历底层链表找到对应的下标,进行插入.
6.#remove(int index)
ArrayList删除指定位置的元素要涉及到数组的移动.
LinkedList删除指定位置的元素要从头遍历到指定位置,进行删除操作.
总结:
对于频繁查询的,建议使用ArrayList
对于频繁插入,删除的,建议使用LinkedList.