openrig 统一配置实战:用 YAML 和 Node.js 管理 Claude Code 与 Codex
2026/10/1 17:19:46
ArrayList与LinkedList:实现原理与性能对比ArrayList和LinkedList都实现了List接口,提供了有序的集合操作,但它们的底层数据结构和操作实现方式完全不同,因此在性能和使用场景上有很大差异。通过对比两者的实现,可以帮助我们在不同场景下做出更合适的选择。
ArrayList和LinkedList的设计思想ArrayList和LinkedList都是List接口的实现类,但它们的设计思想和适用场景有所不同:
ArrayList:LinkedList:ArrayList源码实现ArrayList底层基于数组实现,支持动态扩容。
ensureCapacity:用于判断当前数组的容量是否足够,如果不够则调用grow方法扩容。grow:通过Arrays.copyOf创建一个更大的数组,并将原有数组的元素拷贝过去,扩容后的容量为原容量的1.5倍。ArrayList扩容java复制
private void ensureCapacityInternal(int minCapacity) { if (minCapacity > elementData.length) { grow(minCapacity); } } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容为原容量的1.5倍 elementData = Arrays.copyOf(elementData, newCapacity); }LinkedList源码实现LinkedList底层基于双向链表实现,每个节点包含数据和指向前后节点的指针。
java复制
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; } }linkLast:将新元素插入到链表的末尾。first和尾节点last用于维护链表的开始和结束。LinkedList插入java复制
public void add(E e) { linkLast(e); } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; }ArrayListadd(E e)调用ensureCapacity()检查是否需要扩容。size。LinkedListadd(E e)调用linkLast(E e)方法,将元素插入到链表的尾部。size。ArrayListLinkedListArrayListjava复制
public boolean remove(Object o) { if (o == null) { for (int i = 0; i < size; i++) { if (elementData[i] == null) { fastRemove(i); // 调用fastRemove移除元素 return true; } } } else { for (int i = 0; i < size; i++) { if (o.equals(elementData[i])) { fastRemove(i); // 调用fastRemove移除元素 return true; } } } return false; }LinkedListjava复制
public E remove(int index) { checkElementIndex(index); // 索引越界检查 Node<E> x = node(index); // 找到要删除的节点 E element = x.item; unlink(x); // 移除节点 return element; } void unlink(Node<E> x) { final Node<E> next = x.next; final Node<E> prev = x.prev; if (prev == null) first = next; else prev.next = next; if (next == null) last = prev; else next.prev = prev; x.item = null; size--; }ArrayListLinkedList