LinkedList底层是由双向链表实现的,因此可以支持Queue和Stack。
本文讨论的实现基于JDK8源码。
实现Queue
LinkedList本身实现了Queue接口。
入队
方法签名 | 接口说明(JDK手册) | 代码实现概括(JDK8) |
---|---|---|
boolean add(E e) | 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。 | last处插入新节点 |
boolean offer(E e) | 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。 | 直接调用add() |
出队
方法签名 | 接口说明(JDK手册) | 代码实现概括(JDK8) |
---|---|---|
E element() | 获取,但是不移除此队列的头。 | 取首元素,首元素为空则抛NoSuchElementException异常 |
E peek() | 获取但不移除此队列的头;如果此队列为空,则返回 null。 | 取首元素,首元素为空则返回null |
E poll() | 获取并移除此队列的头,如果此队列为空,则返回 null。 | 调用unlinkFirst()移除首元素 |
E remove() | 获取并移除此队列的头。 | 调用removeFirst(), 比unlinkFirst()多了一个校验,如果首元素为空则抛NoSuchElementException异常 |
实现Stack
Stack类已经比较老,官方已不推荐使用,推荐使用LinkedList替代。
Stack不推荐使用的原因
- 扩展于Vector,Vetcor同样不被推荐;会暴露Vector的方法
- 底层使用数组,有扩容性能问题
- 方法中加了synchronized,性能问题,同时并不能完全保证并发场景下没有问题
栈操作
方法签名 | 接口说明(JDK手册) | 代码实现概括(JDK8) |
---|---|---|
push(E e) | 将元素推入此列表所表示的堆栈。 | 调用addFirst() (即linkFirst()) |
E peek() | 获取但不移除此列表的头(第一个元素)。 | 取首元素,首元素为空则返回null |
E poll() | 获取并移除此列表的头(第一个元素) | 调用unlinkFirst()移除首元素 |
E pop() | 从此列表所表示的堆栈处弹出一个元素。 | 调用removeFirst(), 比unlinkFirst()多了一个校验,如果首元素为空则抛NoSuchElementException异常 |