Java中的队列remove()方法
队列(Queue)是一种有序、限制插入和删除操作的集合。Java中Queue接口是针对队列的一个基本定义,它的实现类有LinkedList和PriorityQueue。Queue中remove()方法是将队列中的头部元素删除并返回该元素的方法。
remove()方法定义
在Queue接口中,remove()方法定义如下:
/**
* 检索并删除队列的头部。
* 如果队列为空,则抛出NoSuchElementException异常。
*/
E remove()
从上面的注释可以看出,如果队列为空,remove()方法会抛出NoSuchElementException异常。
示例代码
下面是使用LinkedList实现队列的示例代码:
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("Alice");
queue.add("Bob");
queue.add("Charlie");
System.out.println("队列头部元素:" + queue.peek()); // 输出“Alice”
queue.remove();
System.out.println("队列头部元素:" + queue.peek()); // 输出“Bob”
queue.remove();
System.out.println("队列头部元素:" + queue.peek()); // 输出“Charlie”
queue.remove();
System.out.println("队列头部元素:" + queue.peek()); // 输出null
// 下面的代码会抛出NoSuchElementException异常
queue.remove();
}
}
在上面的代码中,我们首先创建了一个LinkedList对象作为队列,然后向队列中添加了三个元素。接着,我们使用peek()方法检索队列的头部元素,再使用remove()方法将该元素从队列中删除。最后,我们再次使用peek()方法检索队列的头部元素,由于该元素已被删除,所以输出的是新的队列头部元素。最后,我们调用remove()方法删除了最后一个元素,并试图从空队列中删除元素,导致抛出NoSuchElementException异常。
remove()方法源码
下面是LinkedList中remove()方法的源码:
public E remove() {
return removeFirst();
}
public E removeFirst() {
Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
E unlinkFirst(Node<E> f) {
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}
从上面的源码中可以看到,remove()方法实际上是调用了removeFirst()方法,然后removeFirst()方法又调用了unlinkFirst()方法。unlinkFirst()方法中,首先检查队列是否为空,如果为空就抛出异常;然后取出队列头部元素,将first指针指向下一个元素,最后返回被删除的元素。
结论
Java中Queue接口提供了remove()方法用于删除队列的头部元素。如果队列为空,则该方法会抛出NoSuchElementException异常。在LinkedList中,remove()方法实际上是调用了removeFirst()方法,然后removeFirst()方法又调用了unlinkFirst()方法。unlinkFirst()方法中,首先检查队列是否为空,如果为空就抛出异常;然后取出队列头部元素,将first指针指向下一个元素,最后返回被删除的元素。