1.内部类Node节点,item存储数据内容,next、prev存储前后节点,形成链表。
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.first、last属性字段存储开始节点和结束节点。
/**
* 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;
3.push(E e)将链表当成栈使用,在链表第一个元素前添加新元素,入栈;E pop()返回第一个元素,出栈,当没有元素时会抛异常。
4.offer(E e) peek() poll()等queue队列方法与list方法的对比,主要一点是队列不会抛出异常,而是返回null
方法作用 | 原有 | 返回值 | 队列 | 返回值 | 对比 |
---|---|---|---|---|---|
添加元素 | add(E e) | 成功返回true | offer(E e) | 成功返回true | 直接调用前者 |
添加元素 | addFirst(E e) | 无 | offerFirst(E e) | 成功返回true | 直接调用前者,加返回值 |
添加元素 | addLast(E e) | 无 | offerLast(E e) | 成功返回true | 直接调用前者,加返回值 |
返回首元素 | E peek() | 没有元素返回null | |||
返回首元素 | E element() | 没有元素抛出异常 | |||
返回首元素 | E peekFirst() | 没有元素返回null | |||
返回尾元素 | E peekLast() | 没有元素返回null | |||
删除首元素 | E remove() | 返回被删除的元素,没有元素抛出异常 | E poll() | 返回被删除的元素,没有元素返回null | |
删除首元素 | E removeFirst() | 返回被删除的元素,没有元素抛出异常 | E pollFirst() | 返回被删除的元素,没有元素返回null | |
删除尾元素 | E removeLast() | 返回被删除的元素,没有元素抛出异常 | E pollLast() | 返回被删除的元素,没有元素返回null | |
删除尾元素 | E removeLast() | 返回被删除的元素,没有元素抛出异常 | E pollLast() | 返回被删除的元素,没有元素返回null |
5.有序列化与反序列化writeObject、readObject方法
总结:双向链表,相较于ArrayList易于插入与删除