- ArrayList
- 基于数组实现,查找快:o(1),增删慢:o(n)
- 初始容量为10,扩容通过 System.arrayCopy 方法
- LinkedList
- 基于双向链表实现,查找慢:o(n),增删快:o(1)
- 封装了队列和栈的调用
数组与链表有什么不同?
(双向)链表的优缺点?为什么查找慢、增删快?
数组的优缺点?为什么查找快、增删慢?
关于ArrayList与LinkedList的实现区别分析:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{}
public abstract class AbstractSequentialList<E> extends AbstractList<E>
{}
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{}
AbstractSequentialList有什么用?
ArrayList实现的RandomAccess接口有什么用?
Collections是集合的一个工具类,我们看一下Collections源码中的二分搜索方法。
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}
private static <T>
int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
int low = 0;
int high = list.size()-1;
while (low <= high) {
int mid = (low + high) >>> 1;
Comparable<? super T> midVal = list.get(mid);
int cmp = midVal.compareTo(key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found
}
private static <T>
int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
{
int low = 0;
int high = list.size()-1;
ListIterator<? extends Comparable<? super T>> i = list.listIterator();
while (low <= high) {
int mid = (low + high) >>> 1;
Comparable<? super T> midVal = get(i, mid);
int cmp = midVal.compareTo(key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found
}
这里是根据是否实现了RandomAccess接口来决定使用不同的方法,这两种方法有什么区别?
- indexedBinarySearch使用的索引遍历(实现了RandomAccess接口的List >> ArrayList)
- iteratorBinarySearch使用的是迭代器遍历( >> LinkedList)
为什么要使用不同的遍历方式?
- ArrayList通过for遍历比通过iterator遍历要快(测试结果)
- LinkedList通过iterator遍历比通过for遍历要快(测试结果)
遍历速度为什么不一样?
https://www.cnblogs.com/yeya/p/9950723.html
LinkedList实现的Deque<E>接口有什么用?