LinkedList与ArrayList比较
来源:互联网 发布:centos配置内网ip 编辑:程序博客网 时间:2024/05/18 00:52
LinkedList与ArrayList比较是经常被讨论或者面试经常被问到的问题。本文整理如下:
1、ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。
- ArrayList底层实现
/** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to * DEFAULT_CAPACITY when the first element is added. */ private transient Object[] elementData;
- LinkedList底层实现
/** * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */ transient Node<E> first; /** * Pointer to last node. * Invariant: (first == null && last == null) || * (last.next == null && last.item != null) */ transient Node<E> last; //Node实现 private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
2、对于随机访问get和set,ArrayList优于LinkedList,因为LinkedLIst需要移动指针寻找需要操作具体值。
- LinkedList根据索引获取值
public E get(int index) { checkElementIndex(index); return node(index).item; } //实际取值方法 Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }
虽然对取值方法进行了优化,但是仍然需要遍历,尤其在数据较多情况,效率将远远低于ArrayList。
3、对于新增和删除操作,LinkedList的效率优于ArrayList。
- 如果是单纯在在链表末尾增加或者删除节点,则执行效率相差不多,除非ArrayList内部数组已经饱和,需要扩容.
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
- 如果在链表中增加或者删除节点,则LinkedList的效率则高于ArrayList
主要是因为ArrayList需要将index位置后的数据整体后移或者迁移
public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
而LinkedList则只是将链表断开,然后将新节点收尾相连或者将节点移除,然后将前后节点首尾相连。
void linkBefore(E e, Node<E> succ) { // assert succ != null; final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; modCount++; }
总结
1、对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2、在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3、LinkedList不支持高效的随机元素访问。
4、ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
阅读全文
0 0
- LinkedList与ArrayList比较
- Arraylist与linkedList比较
- ArrayList 与 LinkedList性能比较
- ArrayList与LinkedList的简单比较
- ArrayList与LinkedList迭代时间比较
- ArrayList与LinkedList的简单比较
- ArrayList与LinkedList的简单比较
- java中ArrayList与LinkedList的比较
- LinkedList与ArrayList的性能比较
- ArrayList和LinkedList比较
- ArrayList和LinkedList比较
- 比较ArrayList、LinkedList、Vector
- 比较ArrayList、LinkedList、Vector
- ArrayList & LinkedList & Vector比较
- 比较ArrayList、LinkedList、Vector
- 比较ArrayList、LinkedList、Vector
- ArrayList和LinkedList比较
- ArrayList、LinkedList、Vector比较
- Codeforces 797C-Minimal string
- Django: ImportError: No module named XXX.settings
- Python中raw_input() 与 input()
- 算法训练 装箱问题 递归动态规划
- Shell 下的helloworld!
- LinkedList与ArrayList比较
- 3116 高精度练习之加法
- bzoj1301: [LLH邀请赛]参观路线
- (76)蓝图中的转换
- ORA-01704: 文字字符串过长成功解决
- 数据库面试知识
- TweenJS 一个简单但强大的渐变界面
- setjmp.h学习笔记
- Python程序 Catmouseme