如果堆栈为空,则将 stack.peek() 覆盖为 return null

Override stack.peek() to return null if the stack is empty

在Java中,如果在空栈上调用peek()方法会抛出异常。 目前,为了解决这个问题,我必须在调用 peek().

之前检查堆栈是否为空

有没有办法覆盖 peek() 方法,以便在堆栈为空时 returns null 而不是抛出异常?

您可以对 java 中的任何非最终的 class 执行此操作。查找继承。

public class HackedStack<E> extends Stack<E> {
    @Override
    public E peek() {
       //do your thing
    }
}

虽然你可以使用 stack#empty 完全避免这种情况 https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html#peek()

public void loop() {
   Stack<String> stack = new Stack<>();
   while (!stack.empty()) stack.peek();
}

我认为您可以像这样简单地扩展您自己的堆栈版本:

public class MyCustomStack<E> extends Stack<E> {
    @Override
    public synchronized E peek() {
        if (isEmpty()) {
            return null;
        }
        return super.peek();
    }
}
public class OwnStack<E> extends Stack<E> {
    @Override
    public synchronized E peek() {
        int len = size();
        if (len <= 0) return null;
        return elementAt(len - 1);
    }
}

如果单线程访问栈,应该使用Deque。它的 peek() 方法不仅在空的情况下 return null,而且在单线程场景中也不是同步的,因此速度更快。

Deque<T> stack = new ArrayDeque<>();
stack.addFirst(element);
T element = stack.peekFirst();

如果堆栈被多个线程访问,我认为实现自己的并发堆栈应该更可取,如果容量固定则容易。