Java里面有一个叫做Stack的类,
public class Stack<E> extends Vector<E> {
public Stack() {
}
public E push(E item) {
addElement(item);
return item;
}
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() {
return size() == 0;
}
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
@java.io.Serial
private static final long serialVersionUID = 1224463164541339165L;
}
却没有一个叫做 Queue的类(它是个接口):
public interface Queue<E> extends Collection<E> {
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
}
当然,Java官方已经不推荐使用Stack了,而是推荐使用更加高效的 ArrayDeque:
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
{
// ...
}
它实现了Deque接口,Deque接口扩展了Queue接口,所以ArrayDeque也可以当做队列来使用。
ArrayDeque底层通过数组实现,为了满足双端队列的特性,该数组还必须是循环的,即循环数组,也就是说数组的任何一点都可能被看做是起点或者终点。ArrayDeque不是线程安全的,多线程环境下使用时,需要进行手动同步。该容器还不允许null值的放入。
(剩下的源码里的方法,自行的去阅读一下吧,难度不大的)
2024.10.28
writeBy kaiven