目录
3.2LinkedList:get() 方法 和 node() 方法
1.底层实现原理
ArrayList:ArrayList的底层是动态数组,查询更简便。
LinkedList:LinkedList的底层是链表,添加与删除元素更方便。
2.两者都是实现了List接口的实现类
区别是:
ArrayList:ArrayList 继承 AbstractList 类,实现 List 等接口。
LinkedList:LinkedList 继承 AbstractSequentialList 类,实现 List 和 Deque 等接口,因此可以当队列使用。
3.ArrayList 与 LinkedList的查询
3.1ArrayList:get()方法
源码:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
案例:
3.2LinkedList:get() 方法 和 node() 方法
get()源码:
get()案例:
node()源码:
3.2.1特殊情况
LinkedList 在获取第一个元素和最后一个元素时很快
原因在于,LinkedList 内部有两个属性,分别是 first 和 last 。
这两个属性一直持续的记录着,底层链表里面的第一个元素的位置和最后一个元素的位置在哪里。
源码
所以 LinkedList 在查询第一个元素和最后一个元素时很快,因为不涉及遍历。
4.ArrayList 与 LinkedList的添加
4.1ArrayList
在最后的位置添加元素,不需要移动,需要扩容。
在指定的位置添加元素,指定位置的元素及后面的元素,均往后移动;效率相对较慢。(因为指定了位置,所以不用去遍历查找,但是需要移动元素)
源码:
4.2LinkedList
LinkedList 的添加操作不涉及扩容
在最后的位置添加元素。
源码:
在指定的位置添加元素,需要遍历找到下标,但是插入很快。
5.总结
以下情况使用ArrayList
- 频繁访问列表中的某一个元素。
- 只需要在列表末尾进行添加和删除元素操作。
以下情况使用LinkedList
- 你需要通过循环迭代来访问列表中的某些元素。
- 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。